演算法題目 字串操作

2021-09-26 10:48:25 字數 3949 閱讀 6942

迴圈移位

迴圈移位可以通過部分翻轉然後整體翻轉來完成

字串迴圈移位包含

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

s1 = aabcd, s2 = cdaa

return : true

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

字串迴圈移位

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

s = 「abcd123」 k = 3

return 「123abcd」

將 abcd123 中的 abcd 和 123 單獨翻轉,得到 dcba321,然後對整個字串進行翻轉,得到 123abcd。

字串中單詞的翻轉

s = 「i am a student」

return 「student a am i」

將每個單詞翻轉,然後將整個字串翻轉。

兩個字串包含的字元是否相同

leetcode 242 有效的字母異位詞(簡單)

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

示例 1:

輸入: s = 「anagram」, t = 「nagaram」

輸出: true

示例 2:

輸入: s = 「rat」, t = 「car」

輸出: false

說明:

你可以假設字串只包含小寫字母。

題解:

常規詞頻統計

class solution 

int freqs = new int[26];

int freqt = new int[26];

for(int i=0; i計算一組字元集合可以組成的回文字串的最大長度

leetcode 409 最長回文串(簡單)

給定乙個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的回文串。

在構造過程中,請注意區分大小寫。比如 「aa」 不能當做乙個回文字串。

注意:

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

示例 1:

輸入:「abccccdd」

輸出:7

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

題解:

class solution

for(int i: freq)

if(res同構字串

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

leetcode 205 同構字串(簡單)

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

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

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

示例 1:

輸入: s = 「egg」, t = 「add」

輸出: true

示例 2:

輸入: s = 「foo」, t = 「bar」

輸出: false

示例 3:

輸入: s = 「*****」, t = 「title」

輸出: true

說明:

你可以假設 s 和 t 具有相同的長度。

題解:

使用乙個hashmap記錄

class solution

hashmapmap = new hashmap<>();

for(int i=0; i使用兩個陣列分別記錄當前字元上次出現的位置

class solution

int n = s.length();

// 分別記錄當前字元上次出現的位置, 等於0時表示第一次出現

int slastindexof = new int[256];

int tlastindexof = new int[256];

for(int i=0; i乙個字串中連續回文子字串的個數

leetcode 647 回文子串(中等)

給定乙個字串,你的任務是計算這個字串中有多少個回文子串。

具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被計為是不同的子串。

示例 1:

輸入: 「abc」

輸出: 3

解釋: 三個回文子串: 「a」, 「b」, 「c」.

示例 2:

輸入: 「aaa」

輸出: 6

說明: 6個回文子串: 「a」, 「a」, 「a」, 「aa」, 「aa」, 「aaa」.

注意:

題解:

從字串的某一位開始,嘗試向兩邊去擴充套件子字串

class solution

if(x<0 || x%10 == 0)

int right = 0;

while(x>right)

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

}}

統計二進位制字串中連續 1 和連續 0 數量相同的連續子字串個數

leetcode 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。

注意:

題解:

class solution {

public int countbinarysubstrings(string s) {

int res = 0;

int lastlen = 0; // 記錄之前的連續相同的字元的長度

int curlen = 1; // 記錄當前連續相同的字元的長度

for(int i=1; i參考:cyc2018 演算法

字串題目

1.數串 1.題目描述 設有n個正整數,將他們連線成一排,組成乙個最大的多位整數。如 n 3時,3個整數13,312,343,連成的最大整數為34331213。如 n 4時,4個整數7,13,4,246連線成的最大整數為7424613。輸入描述 有多組測試樣例,每組測試樣例包含兩行,第一行為乙個整數...

字串類演算法題目總結

之前有一篇文章總結了一些字串類的演算法題目。這裡接著看。給定乙個字串,求出其最長重複子串 例如 abcdabcd 最長重複子串是 abcd,最長重複子串可以重疊。直觀的解法是,首先檢測長度為 n 1 的字串情況,如果不存在重複則檢測 n 2,一直遞減下去,直到 1 這種方法的時間複雜度是 o n n...

字串相關題目

判斷兩個字串str1和str2,是否互為旋轉詞 字串str左邊任意長度的子串挪到右邊 1234 的旋轉詞有1234 2341 3412 4123 時間複雜度為o n 做法 1 判斷兩字串長度是否相等 2 長度相等,生成str1 str1的大字串 大字串包含了str1的所有旋轉詞 3 在大字串中尋找是...