1.找一個字符串中無重復(fù)的連續(xù)最長子串,返回長度。Longest Substring Without Repeating Characters
思路:使用hashmap<char,int>保存每個字符及其位置,ij兩個指針指向子串的起止位置,i從左到右循環(huán),j是用于標(biāo)記子字符串最左的位置。先判斷當(dāng)前字符是否在map中有,如果在,那么更新j的位置為map中i的位置的下一個位置map.get(s.charAt(i) +1)或之前j中的最大值;每次循環(huán)中加入一個字符,并更新最大長度。

2.求一個字符串?dāng)?shù)組的最長前綴公共子串
https://leetcode.com/problems/longest-common-prefix/description/
思路:初始子串為數(shù)組第一個字符串的值。用兩個while()嵌套循環(huán)。外循環(huán)是字符串?dāng)?shù)組的個數(shù);內(nèi)循環(huán)是,子串在當(dāng)前字符串中的起始位置是否為0,若不為0,則從尾部去掉子串的一個字符。

3.回文串問題
回文串:“aba” ?“ttaatt”
(1)判斷一個字符類型的字符串是否為回文串
https://leetcode.com/problems/valid-palindrome/description/
思路:使用兩個指針head,tail分別指向字符串的頭和尾,對s[head] == s[tail] 進(jìn)行判斷,若為真,則head++;tail--;否則返回false。直到head不再小于等于tail為止。
本題稍微復(fù)雜一點,需要額外對字符串進(jìn)行去標(biāo)點和空格處理,使用正則表達(dá)式處理。

(2)判斷一個數(shù)字類型的字符串是否為回文串
思路:不用額外的空間,這里使用兩個int變量x,y。

(3)求一個字符串中的最長回文串及其長度
思路:使用兩個指針i,j分別標(biāo)記子串的起止位置,再用dp【i】【j】數(shù)組表示當(dāng)前ij字符串是否為回文。dp[i][j] = (s[i] == s[j] && (j - i < 3 ||dp[i+1][j-1]));
若是回文,那么子串就是i,j所在的字符串。最好輸出子串(或子串長度)


(4)求一個字符串中的所有回文串的個數(shù)
思路:使用上面一題相同的思路,只是在判斷dp【】【】為真時,計數(shù)器加一。

4.字符串中的括號問題
括號字符串匹配問題一般考慮利用“?!钡南冗M(jìn)后出特性實現(xiàn)。
(1)判斷一個字符串是否為匹配的括號字符串。這里包括()【】{}六種字符。
使用一個棧,將每個字符進(jìn)行入站出站操作。當(dāng)前字符為‘(’時,入棧;
當(dāng)前字符為‘)’,先判斷棧是否為空,若空,則返回false;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 若不空,檢查是否為一對括號,是,出棧,不是,返回false。

(2)求長度為N的所有匹配的括號字符串。這里只有()兩種字符。
思路:使用遞歸的思想,以及兩個int分別存儲還剩的左括號個數(shù)、右括號個數(shù)。

(3)求最長的匹配的括號字符串。這里只有()兩種字符
待更新。。。
5.求一個字符串的連續(xù)最大遞增子串的長度
思路:使用一個string保存最長的子串,使用一個指針i,從左向右遍歷。當(dāng)s[i] < s[i - 1],更新子串為s[i],最長長度為1;
當(dāng)s[i] >= s[i - 1],子串尾部加入s[i]。

6.求兩個字符串的最長公共子串的長度(或字符串)
如:s1 = "thisgood" s2 = "sgo"
公共子串為“sgo”,長度為3。
思路:使用游標(biāo)的思想。將兩個字符串看做兩個尺子,把尺子從頭到尾對齊掃描一遍。

可以看出,例子中最長的子串長度為3。
代碼如下。

求最長字符串的代碼如下。
