演算法學習之字串系列小結

2021-10-24 01:23:48 字數 4529 閱讀 1642

附加58. 最後乙個單詞的長度

給定乙個僅包含大小寫字母和空格' '的字串 s,返回其最後乙個單詞的長度。如果字串從左向右滾動顯示,那麼最後乙個單詞就是最後出現的單詞。

如果不存在最後乙個單詞,請返回 0 。

說明:乙個單詞是指僅由字母組成、不包含任何空格字元的 最大子字串。

示例:

輸入: "hello world"

輸出: 5

解題思路:

從右向左遍歷,從第乙個不是空格的字元開始計數,一旦開始計數,再遇到空格就結束了

class

solution

count++;}

return count;

}}

387. 字串中的第乙個唯一字元

給定乙個字串,找到它的第乙個不重複的字元,並返回它的索引。如果不存在,則返回 -1。

示例:

s = "leetcode"

返回 0

s = "loveleetcode"

返回 2

解題思路:

主要思路就是將還沒有出現過的字元存起來,然後依次判斷直到有重複的字元出現。可以勇士set,這裡是字串,只有26個字母,可以用乙個大小為26的陣列來存。

class

solution

for(

int i =

0; i < s.

length()

; i++

)else

}return-1

;}}

242. 有效的字母異位詞

給定兩個字串 s 和 t ,編寫乙個函式來判斷 t 是否是 s 的字母異位詞。

示例 1:

輸入: s = "anagram", t = "nagaram"

輸出: true

示例 2:

輸入: s = "rat", t = "car"

輸出: false

解題思路:

這個題一看就可以用map解決,但是這個是字串,所以同樣可以採用乙個的大小為26的陣列代替map。

對字串出現的字元進行統計,比較兩個字串出現的字元數量是否相同

class

solution

}

205. 同構字串

給定兩個字串 s 和 t,判斷它們是否是同構的。

如果 s 中的字元可以被替換得到 t ,那麼這兩個字串是同構的。

所有出現的字元都必須用另乙個字元替換,同時保留字元的順序。兩個字元不能對映到同乙個字元上,但字元可以對映自己本身。

示例 1:

輸入: s = "egg", t = "add"

輸出: true

示例 2:

輸入: s = "foo", t = "bar"

輸出: false

解題思路:

用兩個陣列分別存當前字元上次出現的位置。

記錄乙個字元上次出現的位置,如果兩個字串中某個字元上次出現的位置一樣,那麼就屬於同構。

class

solution

m1[s.

charat

(i)]

= i +1;

//存這個字元出現的位置

m2[t.

charat

(i)]

= i +1;

}return

true;}

}

409. 最長回文串

給定乙個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的回文串。在構造過程中,請注意區分大小寫。比如 「aa」 不能當做乙個回文字串。

注意:假設字串的長度不會超過 1010。

示例 1:

輸入:

"abccccdd"

輸出:7

解釋:我們可以構造的最長的回文串是"dccaccd", 它的長度是 7。

解題思路:

class

solution

}

9. 回文數

判斷乙個整數是否是回文數。回文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。

不能使用額外空間,也就不能將整數轉換為字串進行判斷。

示例 1:

輸入: 121

輸出: true

class

solution

return x == right || x == right /10;

}}

647. 回文子串

給定乙個字串,你的任務是計算這個字串中有多少個回文子串。具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被視作不同的子串。

示例 1:

輸入:"abc"

輸出:3

解釋:三個回文子串: "a", "b", "c"

示例 2:

輸入:"aaa"

輸出:6

解釋:6個回文子串: "a", "a", "a", "aa", "aa", "aaa"

解題思路:

解決方案是從字串的某一位開始,嘗試著去擴充套件子字串。

動態規劃解法

class

solution

return cnt;

}public

void

helper

(string s,

int l,

int r)

}}

696. 計數二進位制子串

給定乙個字串 s,計算具有相同數量0和1的非空(連續)子字串的數量,並且這些子字串中的所有0和所有1都是組合在一起的。

重複出現的子串要計算它們出現的次數。

示例 1 :

輸入: "00110011"

輸出: 6

解釋: 有6個子串具有相同數量的連續1和0:「0011」,「01」,「1100」,「10」,「0011」 和 「01」。

請注意,一些重複出現的子串要計算它們出現的次數。

另外,「00110011」不是有效的子串,因為所有的0(和1)沒有組合在一起。

示例 2 :

輸入: "10101"

輸出: 4

解釋: 有4個子串:「10」,「01」,「10」,「01」,它們具有相同數量的連續1和0。

解題思路:

官方解答

下面這種解法是根據官方解答改的

public

intcountbinarysubstrings

(string s)

if(prelen >= curlen) ret++;}

return ret;

}

20. 有效的括號

給定乙個只包括'('')''''['']'的字串,判斷字串是否有效。

有效字串需滿足:

左括號必須用相同型別的右括號閉合。

左括號必須以正確的順序閉合。

注意空字串可被認為是有效字串

class

solution')

;if(ch ==

'}'|| ch ==

')'|| ch ==

']')

}return stcak.

empty()

;}}

字串迴圈移位包含
s1 = aabcd, s2 = cdaa

return : true

給定兩個字串 s1 和 s2 ,要求判定 s2 是否能夠被 s1 做迴圈移位得到的字串包含。

s1 進行迴圈移位的結果是 s1s1 的子字串,因此只要判斷 s2 是否是 s1s1 的子字串即可。

字串迴圈移位

將字串向右迴圈移動 k 位。

例如 abcd123 向右移動 3 位 得到 123abcd
將 abcd123 中的 abcd 和 123 單獨逆序,得到 dcba321,然後對整個字串進行逆序,得到 123abcd。

字串中單詞的翻轉

例如將 "i am a student" 翻轉成 "student a am i"
將每個單詞逆序,然後將整個字串逆序。

演算法學習之字串全排列

第一種方法字串全排列,思想上和我們高中學的排列一樣,比如123,開始的時候第乙個位置有三種選擇,第乙個選完之後第二個位置就只剩下兩種選擇,第三個位置,就剩一種,所以一共有n 種排列,所以我們可以用遞迴的思想去做,遞迴中做交換 include include define max 50 void sw...

演算法學習之陣列和字串

陣列和字串 逆序輸出 考慮問題 讀入一些整數,逆序輸出到一行中。已知整數不超過100個。我們把每個數都存下來,存放到 呢?答案是 陣列。include include define maxn 100 10 inta maxn intmain for i n 1 i 1 i printf d n a ...

演算法學習之陣列和字串

陣列和字串 逆序輸出 考慮問題 讀入一些整數,逆序輸出到一行中。已知整數不超過100個。我們把每個數都存下來,存放到 呢?答案是 陣列。include include define maxn 100 10 inta maxn intmain for i n 1 i 1 i printf d n a ...