1. 程式人生 > >求字串中的最長不重複子串

求字串中的最長不重複子串

題目描述:

給定一字串只包含數字,請寫一個演算法,找出該字串中的最長不重複子串(不重複是指子串中每一元素不同於子串中其他元素)
如:“120135435”最長不重複子串為 “201354”

實現如下:

//時間複雜度O(n)
//空間複雜度O(m)
class Solution
{
public:
    int maxNum(int num1, int num2)
    {
        return num1 >= num2 ? num1 : num2;
    }
    void maxNonRepetitiveString(string str)
    {
        if
(str.empty()) return; //map整形陣列一共有10個元素,用來儲存0-9數字的最後一次出現的下標 int map[10]; //將map陣列的所有元素初始化為-1 for (int i = 0; i < 10; ++i) map[i] = -1; int begin = 0; //begin用來記錄最長無重複子串的起始下標 int end = 0; //end用來記錄最長無重複子串的終止下標 int current = 0; //current用來記錄當前得到的無重複子串長度
int pre = -1; //pre用來記錄當前無重複子串的起始位置-1 int len = 0; //len用來記錄最長無重複子串的長度 for (int j = 0; j < str.length(); ++j) { //判斷pre在當前字元最後一次出現位置的左邊還是右邊 //如果在左邊,即pre<map[str[j]],表示在str[j]的位置已經出現了重複的字元了 //如果在右邊,即pre>=map[str[j]],表示在str[j]的位置沒有出現重複字元
pre = maxNum(pre, map[str[j]]); //計算當前無重複子串的長度 current = j - pre; //比較當前無重複子串長度是否大於最大無重複子串長度 if (len <= current) { begin = pre + 1; //更新無重複子串的起始下標 end = j; //更新無重複子串的終止下標 } len = maxNum(len, current); //更新最長無重複子串的長度 map[str[j]] = j; //更新str[j]字元最後一次出現的位置下標 } //列印最長無重複子串 for (int k = begin; k <= end; ++k) cout << str[k]; } };