Leetcode 題解 - 字符串

字符串循環移位包含

編程之美 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"

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

兩個字符串包含的字符是否完全相同

242. Valid Anagram (Easy)

s = "anagram", t = "nagaram", return true.
s = "rat", t = "car", return false.

可以用 HashMap 來映射字符與出現次數,然後比較兩個字符串出現的字符數量是否相同。

由於本題的字符串只包含 26 個小寫字符,因此可以使用長度爲 26 的整型數組對字符串出現的字符進行統計,不再使用 HashMap。

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章