作者:CYC2018
文章鏈接:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode+%E9%A2%98%E8%A7%A3.md
本文主要介紹的是LeetCode題庫中與字符串相關的經典題目,提供了LeetCode原題題號,參考答案,以及題目的部分解析。
大家可以參考這個刷題指南來完成對字符串部分題目的練習,當然,這只是一部分,字符串的相關題目還有很多,譬如最長公共子序列和最長公共子串,這里列舉的只是LeetCode中的字符串題目。
字符串
兩個字符串包含的字符是否完全相同
242. Valid Anagram (Easy)
s = "anagram", t = "nagaram", return true.
s = "rat", t = "car", return false.
字符串只包含小寫字符,總共有 26 個小寫字符。可以用 HashMap 來映射字符與出現次數。因為鍵的范圍很小,因此可以使用長度為 26 的整型數組對字符串出現的字符進行統計,然后比較兩個字符串出現的字符數量是否相同。
public boolean isAnagram(String s, String t) {
int[] cnts = new int[26];
for (char c : s.toCharArray()) {
cnts[c - 'a']++;
}
for (char c : t.toCharArray()) {
cnts[c - 'a']--;
}
for (int cnt : cnts) {
if (cnt != 0) {
return false;
}
}
return true;
}
計算一組字符集合可以組成的回文字符串的最大長度
409. Longest Palindrome (Easy)
Input : "abccccdd"
Output : 7
Explanation : One longest palindrome that can be built is "dccaccd", whose length is 7.
使用長度為 256 的整型數組來統計每個字符出現的個數,每個字符有偶數個可以用來構成回文字符串。
因為回文字符串最中間的那個字符可以單獨出現,所以如果有單獨的字符就把它放到最中間。
public int longestPalindrome(String s) {
int[] cnts = new int[256];
for (char c : s.toCharArray()) {
cnts[c]++;
}
int palindrome = 0;
for (int cnt : cnts) {
palindrome += (cnt / 2) * 2;
}
if (palindrome < s.length()) {
palindrome++; // 這個條件下 s 中一定有單個未使用的字符存在,可以把這個字符放到回文的最中間
}
return palindrome;
}
字符串同構
205. Isomorphic Strings (Easy)
Given "egg", "add", return true.
Given "foo", "bar", return false.
Given "paper", "title", return true.
記錄一個字符上次出現的位置,如果兩個字符串中的字符上次出現的位置一樣,那么就屬於同構。
public boolean isIsomorphic(String s, String t) {
int[] preIndexOfS = new int[256];
int[] preIndexOfT = new int[256];
for (int i = 0; i < s.length(); i++) {
char sc = s.charAt(i), tc = t.charAt(i);
if (preIndexOfS[sc] != preIndexOfT[tc]) {
return false;
}
preIndexOfS[sc] = i + 1;
preIndexOfT[tc] = i + 1;
}
return true;
}
回文子字符串
647. Palindromic Substrings (Medium)
Input: "aaa"
Output: 6
Explanation: Six palindromic strings: "a", "a", "a", "aa", "aa", "aaa".
從字符串的某一位開始,嘗試着去擴展子字符串。
private int cnt = 0;
public int countSubstrings(String s) {
for (int i = 0; i < s.length(); i++) {
extendSubstrings(s, i, i); // 奇數長度
extendSubstrings(s, i, i + 1); // 偶數長度
}
return cnt;
}
private void extendSubstrings(String s, int start, int end) {
while (start >= 0 && end < s.length() && s.charAt(start) == s.charAt(end)) {
start--;
end++;
cnt++;
}
}
判斷一個整數是否是回文數
9. Palindrome Number (Easy)
要求不能使用額外空間,也就不能將整數轉換為字符串進行判斷。
將整數分成左右兩部分,右邊那部分需要轉置,然后判斷這兩部分是否相等。
public boolean isPalindrome(int x) {
if (x == 0) {
return true;
}
if (x < 0 || x % 10 == 0) {
return false;
}
int right = 0;
while (x > right) {
right = right * 10 + x % 10;
x /= 10;
}
return x == right || x == right / 10;
}
統計二進制字符串中連續 1 和連續 0 數量相同的子字符串個數
696. Count Binary Substrings (Easy)
Input: "00110011"
Output: 6
Explanation: There are 6 substrings that have equal number of consecutive 1's and 0's: "0011", "01", "1100", "10", "0011", and "01".
public int countBinarySubstrings(String s) {int preLen = 0, curLen = 1, count = 0;
for (int i = 1; i < s.length(); i++) {
if (s.charAt(i) == s.charAt(i - 1)) {
curLen++;
} else {
preLen = curLen;
curLen = 1;
}
if (preLen >= curLen) {
count++;
}
}
return count;
}
字符串循環移位包含
編程之美:3.1
s1 = AABCD, s2 = CDAA
Return : true
給定兩個字符串 s1 和 s2,要求判定 s2 是否能夠被 s1 做循環移位得到的字符串包含。
s1 進行循環移位的結果是 s1s1 的子字符串,因此只要判斷 s2 是否是 s1s1 的子字符串即可。
字符串循環移位
編程之美:2.17
s = "abcd123" k = 3
Return "123abcd"
將字符串向右循環移動 k 位。
將 abcd123 中的 abcd 和 123 單獨逆序,得到 dcba321,然后對整個字符串進行逆序,得到 123abcd。
字符串中單詞的翻轉
程序員代碼面試指南
s = "I am a student"
return "student a am I"
將每個單詞逆序,然后將整個字符串逆序
如果覺得文章不錯,歡迎點好看和轉發哈
熱 文 推 薦
長按掃碼加關注,人在江湖不迷路
關注之后加星標,江湖要事早知道