由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 求G加一题的线性解法
相关主题
Google onsite 题目求助上一道题吧
G phone interviewlongest valid Parentheses有O(n)算法么
星期一福利:某公司店面题(已解决,code错了) online judge 有的时候会有点小bug吗?
讨论一道G的题find longest substring which contains just two unique characters.leetcode online judge Longest Palindromic Substring memory limit exceeded
问道Google题目Leetcode- Longest Substring Without Repeating Characters 的 test case
请教一道题目求助一道 Longest Common Substring 的变形面试题
一道Google面试题,怎么做?(题目描述有误,已修改)请教:这个10来行的leetcode程序有什么问题?
给定字符串,求其不出现重复字符的子字符串的最大长度有人同看Longest Palindromic Substring 这道题么?
相关话题的讨论汇总
话题: curr话题: int话题: len话题: max话题: index
进入JobHunting版参与讨论
1 (共1页)
f*********m
发帖数: 726
1
在前面一位牛妹的帖子里看到的。
Given a string, find longest substring which contains just two unique
characters.
谢谢。
r*******e
发帖数: 7583
2
两个指针一前一后,扫一遍就行了把

【在 f*********m 的大作中提到】
: 在前面一位牛妹的帖子里看到的。
: Given a string, find longest substring which contains just two unique
: characters.
: 谢谢。

p****e
发帖数: 3548
3
夹着就不行了吧
abaabc

【在 r*******e 的大作中提到】
: 两个指针一前一后,扫一遍就行了把
p****e
发帖数: 3548
4
#include
using namespace std;
string find2char(const string & s){
size_t size = s.size();
if(size <= 2) return s.substr(0, size);
vector index(256, -1);
int maxlen = 1, len, p1 = 0, p2 = 0, pm_begin = 0;
index[s[0]] = 0;
for(int i=1; i < size; ++i){
if(index[s[i]] >= 0){
index[s[i]] = i;
continue;
}
index[s[i]] = i;
p2 = i;
break;
}
if(p2 == 0) return s.substr(pm_begin, size);
maxlen = p2 - p1 + 1;
len = p2 - p1 + 1;
for(int i = p2 + 1; i < size; ++i){
if(index[s[i]]>=0){
index[s[i]] = i;
++len;
continue;
}
if(len > maxlen){
maxlen = len;
pm_begin = p1;
}
if(index[s[p1]] > index[s[p2]]){
int temp = index[s[p2]];
index[s[p2]] = -1;
p1 = temp + 1;
}
else{
int temp = index[s[p1]];
index[s[p1]] = -1;
p1 = temp + 1;
}
p2 = i;
index[s[i]] = i;
len = p2 - p1 + 1;
}
if(len > maxlen){
maxlen = len;
pm_begin = p1;
}
return s.substr(pm_begin, maxlen);
}
int main() {
// Start typing your code here...
string s ( "abaaabcccccaaaccccdd");
cout << find2char(s) << endl;


return 0;
}
r*******e
发帖数: 7583
5
扫的时候用个hashmap计数,跟夹着不夹着没关系

【在 p****e 的大作中提到】
: 夹着就不行了吧
: abaabc

l*****s
发帖数: 774
6
这个hashmap计数太巧妙了,我自己估计想不到,到面试的时候紧张更想不到了。
试着写了一下:
class Solution
{
public:
std::string twoUnique(std::string & s)
{
if(s.size() <= 2) return s;
int max_start = 0;
int max_len = 2;
int i = 0;
int j = 0;
std::unordered_map m;
while(i<=j && j< s.size())
{
while(m.size() <= 2 && j {
if(m.count(s[j]) == 0)
m[s[j]] = 1;
else
++m[s[j]];
if(m.size() <= 2 && (j-i+1) > max_len)
{
max_start = i;
max_len = j-i+1;
}
++j;
}
if(j==s.size()) return s.substr(max_start, max_len);
if(m[s[i]] == 1)
m.erase(s[i]);
else
--m[s[i]];
++i;
}
}
};

【在 r*******e 的大作中提到】
: 扫的时候用个hashmap计数,跟夹着不夹着没关系
d****n
发帖数: 233
7
I posted a solution (in C#) here:
http://codeanytime.blogspot.com/2013/05/longest-substring-which

【在 l*****s 的大作中提到】
: 这个hashmap计数太巧妙了,我自己估计想不到,到面试的时候紧张更想不到了。
: 试着写了一下:
: class Solution
: {
: public:
: std::string twoUnique(std::string & s)
: {
: if(s.size() <= 2) return s;
: int max_start = 0;
: int max_len = 2;

e*******i
发帖数: 56
8
No map is needed. Source is as following:
///////////////
#include
using namespace std;
int findLongest(char *s, char **start)
{

if(!s) return 0;
char first, second;
char *beginOfPreviousChar;
int currMax=0;
char *curr=s;
first=*s;
*start=s;
while(*curr)
{
if(*curr!=first) break;
currMax++;
curr++;
}
if( !*curr ) return currMax; //end of string
else
{
second=*curr;
beginOfPreviousChar=curr;
}

int max=0;
do
{
if( first==*curr || second==*curr )
currMax++;
else
{
if(currMax>max)
{
max=currMax;
*start=curr-max;
}
currMax=curr-beginOfPreviousChar+1;
}
if(second!=*curr)
{
first=second;
second=*curr;
beginOfPreviousChar=curr;
}
}while(*curr++);
return max;
}
int main()
{
char *start;
char s[]="aabaaabbbaabab";
int res= findLongest(s, &start);
cout<<"res is"< while(res>0)
{
cout<<*start++;
res--;
}
cout< }
p****e
发帖数: 3548
9
赞这个,简洁高效

【在 e*******i 的大作中提到】
: No map is needed. Source is as following:
: ///////////////
: #include
: using namespace std;
: int findLongest(char *s, char **start)
: {
:
: if(!s) return 0;
: char first, second;
: char *beginOfPreviousChar;

d****n
发帖数: 233
10
Nice, marked.

【在 e*******i 的大作中提到】
: No map is needed. Source is as following:
: ///////////////
: #include
: using namespace std;
: int findLongest(char *s, char **start)
: {
:
: if(!s) return 0;
: char first, second;
: char *beginOfPreviousChar;

f*********m
发帖数: 726
11
看到大家的回复,我意识到可能是我把题意理解错了。我的理解是只有两个字符是不重
复的(unique),可以包括其他的重复字符。比如输入是 addabcccb,输出是ddabccc
, a和b是两个unique字符,c和d可以重复。
这样理解的话似乎更难了,还有线性解法吗?
(已在原贴进行了更新。)
谢谢。
d****n
发帖数: 233
12
You can do the following:
1. scan the whole string to build a hashmap with each character as the key
and frequent as value.
2. from both end of the string, recursively check if current substring
contains two unique chars.
if not, chop the beginning char, return if the remaining substring meet
requirement,else add back the beginning char, chop the end char and see if
the requirement meet.
it should be O(N).

ddabccc

【在 f*********m 的大作中提到】
: 看到大家的回复,我意识到可能是我把题意理解错了。我的理解是只有两个字符是不重
: 复的(unique),可以包括其他的重复字符。比如输入是 addabcccb,输出是ddabccc
: , a和b是两个unique字符,c和d可以重复。
: 这样理解的话似乎更难了,还有线性解法吗?
: (已在原贴进行了更新。)
: 谢谢。

1 (共1页)
进入JobHunting版参与讨论
相关主题
有人同看Longest Palindromic Substring 这道题么?问道Google题目
python搞不定Longest Palindromic Substring啊请教一道题目
one amazon interview problem一道Google面试题,怎么做?(题目描述有误,已修改)
A simple interview question给定字符串,求其不出现重复字符的子字符串的最大长度
Google onsite 题目求助上一道题吧
G phone interviewlongest valid Parentheses有O(n)算法么
星期一福利:某公司店面题(已解决,code错了) online judge 有的时候会有点小bug吗?
讨论一道G的题find longest substring which contains just two unique characters.leetcode online judge Longest Palindromic Substring memory limit exceeded
相关话题的讨论汇总
话题: curr话题: int话题: len话题: max话题: index