迴圈移位
迴圈移位可以通過部分翻轉然後整體翻轉來完成
字串迴圈移位包含
給定兩個字串 s1 和 s2,要求判定 s2 是否能夠被 s1 做迴圈移位得到的字串包含。
s1 = aabcd, s2 = cdaas1 進行迴圈移位的結果是 s1s1 的子字串,因此只要判斷 s2 是否是 s1s1 的子字串即可。return : true
字串迴圈移位
將字串向右迴圈移動 k 位。
s = 「abcd123」 k = 3將 abcd123 中的 abcd 和 123 單獨翻轉,得到 dcba321,然後對整個字串進行翻轉,得到 123abcd。return 「123abcd」
字串中單詞的翻轉
s = 「i am a student」將每個單詞翻轉,然後將整個字串翻轉。return 「student a am i」
兩個字串包含的字元是否相同
leetcode 242 有效的字母異位詞(簡單)
給定兩個字串 s 和 t ,編寫乙個函式來判斷 t 是否是 s 的字母異位詞。
示例 1:
輸入: s = 「anagram」, t = 「nagaram」示例 2:輸出: true
輸入: 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」示例 2 :輸出: 6
解釋: 有6個子串具有相同數量的連續1和0:「0011」,「01」,「1100」,「10」,「0011」 和 「01」。
請注意,一些重複出現的子串要計算它們出現的次數。
另外,「00110011」不是有效的子串,因為所有的0(和1)沒有組合在一起。
輸入: 「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 在大字串中尋找是...