3 Longest Substring Without Repeating Character

LINK:https://oj.leetcode.com/problems/longest-substring-without-repeating-characters

Solution:https://github.com/haoel/leetcode

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

求最長非重複子串,其關鍵在於重複開始處,一般思路:

遍歷字符串,尋找當前字符movePos指向"abcabcbb"在其後重複位置記以lastRepeatPos,指向"abcabcbb"依次判斷b在其後重複位置,如b的位置newPos < lastRepeatPos,更新lastRepeatPos,否則不變,依次爲c的判斷,當前位置movePos+1 = lastRepeatPos時,"abcabcbb",lastRepeatPos爲第一個非重複子串的長度"abc",依次最長非重複子串爲"bca""cab","abc";

class Solution {
public:	
		int findRepeatPos(int ind, string s){
		for(size_t i=ind+1; i<s.size(); i++)
			if(s[ind] == s[i]) return i;
		return -1;
	}
	int findLongestSubstring(string s)
	{
		int movePos = 0, LastRepeatPos = s.size();

		for(size_t i=0; i < s.size() && movePos <= LastRepeatPos; i++){
			int repeatPos = findRepeatPos(i, s);
			if(repeatPos!=-1 && repeatPos < LastRepeatPos) LastRepeatPos = repeatPos;
			
			if(i + 1 ==  LastRepeatPos) return LastRepeatPos;
		}

		return LastRepeatPos;
	}

	int lengthOfLongestSubstring(string s) {
		int longest = 0;
		for(size_t i=0; i<s.size(); i++) {
			int len = findLongestSubstring(s.substr(i, s.size()-i));
			if(longest < len) longest = len;
		}

		return longest;
	}

};



繼續優化算法:其實這是一個遍歷非重複子串部分的過程,並記錄下最長子串的長度。

遍歷非重複部分過程中,只需要知道當前字符是否在之前出現過,如果出現了則需要重新開始最長非重複子串的計數。在字符串"abcabcbb"中,lastRepeatPos從-1計數,意指非重複子串的開始位置,movePos指當前字符,判斷當前字符是重複出現,如果在非重複子串的開始lastRepeatPos後出現過,即非重複開始的位置lastRepeatPos < movePos,重置lastRepeatPos至movePos曾經出現過的位置,如果沒有出現過,即lastRepeatPos > movePos即可獲得一非重複子串的長度,如果比記錄下來的非重複子串長度還長,替換其。

該部分代碼爲

function lengthOfLongestSubstring(string s)
for (i=0; i<s.size() ;i++)
{
	if(s[i] repeat again and lastRepeatPos < REPEAT_POS[s[i]])
		lastRepeatPos = REPEAT_POS[s[i]];
	else
		cur_len = i-lastRepeatPos;
}

如何保存出現過的字符的位置,利用map的特性map<key_char, value_pos>,key_char保存出現過的字符,value_pos保存字符位置。

或者使用字符位置數組:

const int MAX_CHAR = 256;
REPEAT_POS[MAX_CHAR];

class Solution {
public:
		int lengthOfLongestSubstring(string s) {
		map<char, int> m;
		int maxLen = 0;
		int lastRepeatPos = -1;
		for(int i=0; i<s.size(); i++){
			if (m.find(s[i])!=m.end() && lastRepeatPos < m[s[i]]) {
				lastRepeatPos = m[s[i]];
			}
			if ( i - lastRepeatPos > maxLen){
				maxLen = i - lastRepeatPos;
			}
			m[s[i]] = i;
		}
		return maxLen;
	}
};


發佈了49 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章