(算法)最長不重復子串


題目:

從一個字符串中找到一個連續子串,該子串中任何兩個字符不能相同,求子串的最大長度並輸出一條最長不重復子串。

思路:

利用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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM