寻找最长子串,该子串只包含两种字符
2013-05-14 21:01
375 查看
思路:初始时,i指向第一个字符,j指向第一个不等于i的字符,k从j+1开始找第一个不等于i和j对应字符的位置,另外设有变量rightMosti和rightMostj分别表示i和j对应字符在最右边出现的位置,i的下一个位置即为min(rightMosti,rightMostj)+1,j=k,k从下个位置开始找。时间复杂度为:O(n)。
#include<iostream> using namespace std; int hash[26]; int getSubString(char* ch){ int len=strlen(ch); if(len<=1) return -1; int i=0,j,k,res=0,rightMosti=0,rightMostj; for(j=i+1;j<len;j++){ if(ch[j]!=ch[i]) break; rightMosti=j; } if(j==len) return -1;//没有找到 else { while(i<len-1){ hash[ch[i]-'a']=1; hash[ch[j]-'a']=1; rightMostj=j; for(k=j+1;k<len;k++) { if(hash[ch[k]-'a']==0) break; if(ch[k]==ch[i]) rightMosti=k; if(ch[k]==ch[j]) rightMostj=k; } if(k==len){ if(len-i>res) res=len-i; break; } else{ if(k-i>res) res=k-i; hash[ch[i]-'a']=0; hash[ch[j]-'a']=0; i=min(rightMosti,rightMostj)+1; j=k; } } } return res; } int main(){ memset(hash,0,sizeof(hash)); char* tmp="aaaaaaadgfasdfa"; cout<<getSubString(tmp)<<endl; system("pause"); return 0; }
相关文章推荐
- 【谷歌面试题】找出字符串中只包含两种字符的最长子串
- [LeetCode]3. Longest Substring Without Repeating Characters寻找最长无重复字符的子串
- LeetCode 3. Longest Substring Without Repeating Characters--不包含重复字符的最长子串长度
- 求字符串内不包含重复字符的最长子串
- 求字符串中包含唯一字符的最长子串
- leetcode:Longest Substring Without Repeating Characters (寻找最长无重复字符的子串)
- 求字符串内不包含重复字符的最长子串
- 寻找字符串的最长不重复子串,计算复杂度O(n),两种实现
- 求字符串内不包含重复字符的最长子串的集合
- 寻找最长无重复字符子串 Longest Substring Without Repeating Characters
- 求字符串中最长无重复字符的子串
- Blue Jeans POJ 3080 寻找多个串的最长相同子串
- 3. 无重复字符的最长子串(O(N))
- 求字符串中不含重复字符的最长子串的长度
- Leetcode 刷题(python)之 无重复字符的最长子串
- 微软面试100题:字符串匹配算法,查找包含字符集的子串
- UVA 1399 Puzzle 求一个最长的串使得该串不包含任何禁止串为子串 AC自动机 + DP +dfs判环
- 一个字符串中包含另一个字符串所有字符的最短子串长度?——《编程之美》最短摘要的生成的简化
- [Google] 字符串的最长子串,该子串的每个字符都不同 要求O(n)
- 最长无重复字符的子串