求字串中的最長不重複子串
阿新 • • 發佈:2019-01-29
題目描述:
給定一字串只包含數字,請寫一個演算法,找出該字串中的最長不重複子串(不重複是指子串中每一元素不同於子串中其他元素)
如:“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];
}
};