leetcode刷題 字串

2022-07-07 13:24:13 字數 3948 閱讀 3083

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

示例 1:

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

輸出: true

示例 2:

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

輸出: false

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

高階:如果輸入字串包含 unicode 字元怎麼辦?你能否調整你的解法來應對這種情況?

題解:如果只是26個小寫字母,那麼建立乙個長度為26的陣列記錄每個字母出現的頻次資訊就夠了。如果包含unicode字元,需要使用map來儲存。

class

solution

mapmap = new hashmap<>();

for(int i = 0; i < sarr.length; i++)

for(int i = 0; i < sarr.length; i++)

else

if(map.get(tarr[i]) == 1)

else

}if(map.isempty())

else

}}

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

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

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

示例 1:

輸入:"abccccdd"

輸出:7

這個題我的做法是將元素存放雜湊表中,記錄頻次資訊,然後取出所有的values值進行操作。

這個題遇到了乙個bug記錄一下:

map.values( )  返回的是collection型別。collection被定義為介面,需要進行例項化,但是將其強轉成(list)又會報錯。

最後使用的是arraylist的乙個構造方法,arraylist(collection<?extendse> 。

class

solution

//collectioncoll = map.values();

//map的values值是以collection的形式返回

list coll = new arraylist(map.values());

iterator iterator =coll.iterator();

int flag = 0; //

記錄回文串是否為奇數的標誌

int sum = 0;

while

(iterator.hasnext())

sum = sum + temp / 2;

}return sum * 2 +flag;

}}

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

如果 s 中的字元可以按某種對映關係替換得到 t ,那麼這兩個字串是同構的。

每個出現的字元都應當對映到另乙個字元,同時不改變字元的順序。不同字元不能對映到同乙個字元上,相同字元只能對映到同乙個字元上,字元可以對映到自己本身。

示例 1:

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

輸出:true

class

solution

else

if((map.containskey(sarr[i]) && map.get(sarr[i]) ==tarr[i]))

else

}return

true

; }

}

使用陣列來記錄好像更簡單。

class

solution

preindexofs[sc] = i + 1;

preindexoft[tc] = i + 1;

}return

true;}

}

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

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

示例 1:

輸入:"abc"

輸出:3

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

感覺思路是一致的,我的**四十多行,大佬的**就十幾行,我/(ㄒoㄒ)/~~

class

solution

return

sum;

}//以i為中心的回文子串的個數

public

int sum1(int i, char

arr)

else

k++;

}return

sum;

}//以i + 0.5為中心的回文子串的個數

public

int sum2(int i, char

arr)

else

k++;

}return

sum ;

}}

class

solution

return

cnt;

}private

void extendsubstrings(string s, int start, int

end)

}}

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

你能不將整數轉為字串來解決這個問題嗎?

使用字串確實簡單。

class

solution

}return

true

; }

}

·不使用字串,更多的使用數學的方式。不停地使用餘數成十以致兩個數長度差在1以內。

class

solution

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

int right = 0;

while (x >right)

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

}}

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

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

示例 1 :

輸入: "00110011"

輸出: 6

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

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

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

這個題不容易,忙碌了幾個小時的菜鳥程式設計師發現執行時間超出限制。

寫程式確實需要腦袋清醒,之前的思路正確但是巢狀迴圈太浪費執行時間。換換思路還是事半功倍。

class

solution

int k = 1;

while(i - k + 1 >= 0 && i + k else

}}

return

sum;

}}

貼乙個大佬的做法,演算法確實妙。

class

solution

else

if (prelen >=curlen)

}return

count;

}}

leetcode刷題 字串 反轉字串

給定乙個字串 s 和乙個整數 k,你需要對從字串開頭算起的每隔 2k 個字元的前 k 個字元進行反轉。如果剩餘字元少於 k 個,則將剩餘字元全部反轉。如果剩餘字元小於 2k 但大於或等於 k 個,則反轉前 k 個字元,其餘字元保持原樣。示例 輸入 s abcdefg k 2 輸出 bacdfeg 該...

LeetCode刷題 字串陣列之間轉換

給你乙個僅由數字 6 和 9 組成的正整數 num。你最多只能翻轉一位數字,將 6 變成 9,或者把 9 變成 6 請返回你可以得到的最大數字。示例 1 輸入 num 9669 輸出 9969 解釋 改變第一位數字可以得到 6669 改變第二位數字可以得到 9969 改變第三位數字可以得到 9699...

刷題 字串 加入數字

題面 有乙個長度不超過20位的整數 以字串的形式給出 同時給出乙個加入數字p,p可加入在整數的任何位置。加入之 後,再刪去乙個數字,使剩下來的數最大。例如 有整數 1 2 3 4 5 6 7 8,p 為 5 得到的結果 5 2 3 4 5 6 7 8 說明 1 2 3 4 5 6 7 8 加入5之後...