面试题:最长不含重复字符的子字符串
2018-02-02 12:21
351 查看
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含'a'~'z'的字符。例如,在字符串“arabcacfr”中,最长的不含重复字符的子字符串是“acfr”,长度为4。
思路:常规套路的话,先求有多少个子字符串,再看看是否有重复字符,那么一套下来就要O(n^3)。有点多,那么就用动态规划咯。
参考代码如下:
int longestSubstringWithoutDuplication(const std::string& str)
{
int curLength=0;
int maxLength=0;
int* position=new int[26] ;
for(int i=0;i<26;i++)
position[i]=-1;
for(int i=0;i<str.length();i++)
{
int prevIndex=position[str[i]-'a'];
if(prevIndex<0||i-prevIndex>curLength)
++curLength;
else
{
if(curLength>maxLength)
maxLength=curLength;
curLength=i-prevIndex;
}
position[str[i]-'a']=i;
}
if(curLength>maxLength)
maxLength=curLength;
delete[] position;
return maxLength;
}
思路:常规套路的话,先求有多少个子字符串,再看看是否有重复字符,那么一套下来就要O(n^3)。有点多,那么就用动态规划咯。
参考代码如下:
int longestSubstringWithoutDuplication(const std::string& str)
{
int curLength=0;
int maxLength=0;
int* position=new int[26] ;
for(int i=0;i<26;i++)
position[i]=-1;
for(int i=0;i<str.length();i++)
{
int prevIndex=position[str[i]-'a'];
if(prevIndex<0||i-prevIndex>curLength)
++curLength;
else
{
if(curLength>maxLength)
maxLength=curLength;
curLength=i-prevIndex;
}
position[str[i]-'a']=i;
}
if(curLength>maxLength)
maxLength=curLength;
delete[] position;
return maxLength;
}
相关文章推荐
- 百度面试题 求字符串中不含重复字符的最长子串长度
- 求字符串中不含重复字符的最长子串
- 在英文字符串中找第一个最长不含重复字符的子串高效实现(修改版)
- 剑指Offer(第二版)面试题48:最长不含重复字符的子字符串
- 剑指offer面试题48: 最长不含重复字符的子字符串
- 定义一个栈的数据结构,实现min函数,要求push,pop,min时间复杂度是0(1);找出字符串中的最长子串,要求子串不含重复字符,时间复杂度是O(n);
- 定义一个栈的数据结构,实现min函数,要求push,pop,min时间复杂度是0(1);找出字符串中的最长子串,要求子串不含重复字符,时间复杂度是O(n);
- 求字符串中不含重复字符的最长子串的长度
- C++找出字符串中最长的不含重复字符的子串
- 求字符串中不含重复字符的最长子串的长度
- 求字符串最长不含重复字符的子串长度
- 字符串最长不含重复字符的子串长度
- 从字符串中找出一个最长的不含重复字符的子字符串
- 亚马逊面试:输出字符串中所有最长的无重复字符的子字符串
- 剑指offer 面试题35扩展:删除字符串中所有重复出现的字符 (C++版)
- 02_对N个长度最长可达到1000的数进行排序、对给定的一个字符串,找出有重复的字符,并给出其位置、输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序
- 给定一个字符串,找到最长的子串的长度没有重复字符
- 面试题35:寻找一个字符串中最长的重复子串
- 写一个函数,用来把一个字符串用指定的字符作为分隔符分割成若干个子串输出 | 写一个函数,用来返回一个字符串中重复出现的最长字串的长度及其开始地址
- 【算法剖析】求字符串中无重复字符的最长字串