一直以為這個方法是對的,後來發現這種方法是錯誤的,不能處理巢狀的情況,如"adercijckega",稍後再修正!
最近面試遇到這題,再網上參考了一些blog,自己歸納出方法並用c++實現。
問題:求出字串中最長不重複的字串,如「abccdefgchi」,最長不重複字串為defgchi.
分析:1.定義乙個二維陣列
bit[26][2]:
其中bit[ch - 'a'][0]為0表示字元ch還未出現過,bit[ch - 'a'][0]為1表示字元ch已經出現過了;bit[ch - 'a'][1]中儲存的是字元ch在字串中出現的位置。
maxlen: 表示
最長不重複字串的長度;
begin:
標識不重複字串的起點;
end: 標識不重複字串的終點;
start: 當有重複字元出現,以此標識新的不重複字串的起點;
strlen: 不重複字串的長度(這個不重複字串不一定是最長的那個,它只是乙個臨時的不重複字串),隨字串增加而增加;
2.從原字串中逐個讀取字元,如相應的bit[ch - 'a'][0]為0,表示未出現過此字元,則只需將bit[ch - 'a'][0]置1,並在strlen
加1;如果相應的
bit[ch - 'a'][0]為1,說明已經出現過相同字元,判斷此時不重複字串是否比之前得到的最長不重複復字元更長,是的話將此字串當做是最長不重複字串,否則保留原來的最長不重複字串;
3.重複第2步,直到字串結尾;
4.判斷最後一段不重複字串是否比之前得到的最長不重複字串更長,是的話將此字串當做是最長不重複字串,否則保留原來的最長不重複字串;
時間複雜度:因為要對字串中每個字元進行讀取和比較,所以時間複雜度為o(n)。
程式粗略流程圖如下:
#include
int getmaxnorepstr(const char *str, int len);
void main(void)
int getmaxnorepstr(const char *str, int len)
;//用來標識字元是否出現過,和出現的位置
int maxlen = 0;
//最長不重複字串的長度
int begin = 0;
//標識不重複字串的起點
int end = 0;
//標識不重複字串的終點
int start = 0;
//當有重複字元出現,以此標識新的不重複字串的起點
int strlen = 0;
//不重複字串的長度,隨字串增加而增加
int i, n;
const char *pstr = str;
//逐個字元讀取並處理
for (i = 0; i < len; i ++)
else
else
strlen = i - start; //設定新的不重複字串的長度
start = bit[n][1] + 1;
//不重複字串的開始位置重置到此字元的下乙個位置
bit[n][1] = i;
//重複字元定位到新位置
}}//end of for
//最後一段不重複字串和之前的最長不重複字串的比較
if (strlen > maxlen)
//列印最長不重複字串
for (i = begin; i <= end; i ++)
cout << endl;
return maxlen;}
最長不重複字串
程式設計 給定兩個字串a,b 只包含26個英文本母 輸出所有公共的最長子字串 如果出現重複子串,則輸出多次 輸入包括兩行,每行為乙個連續字串 大小寫敏感 輸出包括多行,每行為掃瞄到的最長公共子串,按照該子串在字串a 即第一行輸入字串 中出現的先後次序輸出 abcxyzabcrst opqrstabc...
最長不重複字串 C C
萬能的遍曆法 時間複雜度o n 3 沒有用到啥高深的演算法,遍歷就是了。include stdafx.h include include include 有無重複字元 bool containrepeatch char str return false int tmain int argc,tcha...
找出字串的最長不重複字串
這是我遇到的一道校招題目 給定一字串只包含數字,請寫乙個演算法,找出該字串中的最長不重複子串 不重複是指子串中每一元素不同於子串中其他元素 如 120135435 最長不重複子串為 201354 要求用j a或者c來寫,我用了j a。思想 從頭開始擷取字串,只要後乙個元素不在擷取的字串裡,就更新擷取...