字符串类算法题
1、字符處理:
1)字符過濾:只保留大小字母和數字:
StringBuffer sgood = new StringBuffer(); int length = s.length(); for (int i = 0; i < length; i++) {char ch = s.charAt(i);if (Character.isLetterOrDigit(ch)) {sgood.append(Character.toLowerCase(ch));} }2)大小寫轉換:
Character.toLowerCase(char ch)2、字母統計:
1)所有字符都要統計
int[] count = new int[128]; for(int i=0; i < A.length(); i++)count[A.charAt(i)]++;2)只統計小寫字母或大寫字母?
int[] count = new int[26]; for(int i=0; i < A.length(); i++)count[A.charAt(i)-'a']++;3、回文字符串:正讀反讀都一樣的字符串
1)判斷是否是回文字符串
常見的做法是使用雙指針。定義左右指針,初始時分別指向字符串的第一個字符和最后一個字符,每次判斷左右指針指向的字符是否相同,如果不相同,則不是回文串;如果相同,則將左右指針都往中間移動一位,直到左右指針相遇,則字符串是回文串。
class Solution {public boolean validPalindrome(String s) {int low = 0, high = s.length() - 1;while (low < high) {char c1 = s.charAt(low), c2 = s.charAt(high);if (c1 != c2) return false;}return true;} }?在允許最多刪除一個字符的情況下,同樣可以使用雙指針,通過貪心算法實現。初始化兩個指針 low 和 high 分別指向字符串的第一個字符和最后一個字符。每次判斷兩個指針指向的字符是否相同,如果相同,則更新指針,令 low = low + 1 和 high = high - 1,然后判斷更新后的指針范圍內的子串是否是回文字符串。如果兩個指針指向的字符不同,則兩個字符中必須有一個被刪除,此時我們就分成兩種情況:即刪除左指針對應的字符,留下子串 s[low + 1], s[low + 1], ..., s[high],或者刪除右指針對應的字符,留下子串 s[low], s[low + 1], ..., s[high - 1]。當這兩個子串中至少有一個是回文串時,就說明原始字符串刪除一個字符之后就以成為回文串。
class Solution {public boolean validPalindrome(String s) {int low = 0, high = s.length() - 1;while (low < high) {char c1 = s.charAt(low), c2 = s.charAt(high);if (c1 == c2) {low++;high--;} else {boolean flag1 = true, flag2 = true;for (int i = low, j = high - 1; i < j; i++, j--) {char c3 = s.charAt(i), c4 = s.charAt(j);if (c3 != c4) {flag1 = false;break;}}for (int i = low + 1, j = high; i < j; i++, j--) {char c3 = s.charAt(i), c4 = s.charAt(j);if (c3 != c4) {flag2 = false;break;}}return flag1 || flag2;}}return true;} }2)判斷最長回文字串的長度
有兩個點要注意:
1.回文串中每個字母都會使用偶數次(統計出所有字母的出現次數后,采用/2*2的方法,將出現奇數次的-1,出現偶數次的保持不變)
for(int v:alphabet){max += v/2*2; }2.中文線使用豎線|(回文串長度是偶數)還是字母(回文串長度是奇數),如果某個字母出現了奇數次且當前的回文串長度是偶數,則回文串長度+1,代碼如下
for(int v:alphabet){max += v/2*2;if((v%2==1&&max%2==0))max += 1; }4、上升下降字符串:
給定第一個字符串,第一遍從小到大遍歷末尾,第二遍從大到小遍歷并移動到末尾,如果每次遍歷時最小或者最大字符不止一個?,可以選擇其中任意一個。
輸入:s = "aaaabbbbcccc"
輸出:"abccbaabccba"
解釋:第一輪的步驟 1,2,3 后,結果字符串為 result = "abc"
第一輪的步驟 4,5,6 后,結果字符串為 result = "abccba"
第一輪結束,現在 s = "aabbcc" ,我們再次回到步驟 1
第二輪的步驟 1,2,3 后,結果字符串為 result = "abccbaabc"
第二輪的步驟 4,5,6 后,結果字符串為 result = "abccbaabccba"
?
?
總結
- 上一篇: java.lang包—StringBuf
- 下一篇: Springboot搭建个人博客系列