題目:
從一個字符串中找到一個連續子串,該子串中任何兩個字符不能相同,求子串的最大長度並輸出一條最長不重復子串。
思路:
利用hash表hashTable[256]來保存出現過的字符,然后從頭開始遍歷字符串,
1、如果當前字符ch已經出現過(hashTable[ch]==1),則表示一個局部最長不重復子串已經出現:
此時判斷該子串長度len是否大於mlen,如果是,則更新mlen,以及最長子串的起始位置mstart。
同時將start到重復字符ch之間的hash表重置為0(表示沒有出現過),相應的長度len也減小,然后從ch的下個字符作為新的子串的開始;
2、如果當前字符ch沒有出現過:
則設置hashTable為1(表示出現過),並len++。
時間復雜度:
O(n)
代碼:
#include<iostream> using namespace std; int getLongestUnRepeatedSubStr(const string &str){ int hashTable[256]={0}; int start=0; int mstart=0; int mlen=0; int idx=0; int len=0; while(idx!=str.size()){ if(hashTable[str[idx]]==1){ if(len>mlen){ mstart=start; mlen=len; } while(str[start]!=str[idx]){ hashTable[str[start]]=0; start++; len--; } start++; } else{ hashTable[str[idx]]=1; len++; } idx++; } if(len>mlen){ mlen=len; mstart=start; } cout<< str.substr(mstart,mlen) <<endl; return mlen; } int main(){ string str; while(cin>>str){ cout << getLongestUnRepeatedSubStr(str) << endl; } return 0; }
