日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

字符串类算法题

發布時間:2024/4/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字符串类算法题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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"

class Solution {public String sortString(String s) {//相當于26個桶int[] ch = new int[26];//把s中的字符分別放到對應的桶里for(int i=0; i<s.length();i++){ch[s.charAt(i)-'a'] ++;}//存儲計算的結果StringBuffer res = new StringBuffer();while(res.length()<s.length()){//先從左往右找,遍歷26個桶,如果當前桶不為空,//就從當前桶里拿出一個元素出來for(int i =0;i<26;i++){if(ch[i]>0){res.append((char) (i + 'a'));ch[i]--;//拿出之后桶中元素的個數要減1}}//從右往左拿,同上for(int i=25;i>-1;i--){if(ch[i]>0){res.append((char) (i + 'a'));ch[i]--;}}}//把結果轉化為字符串return res.toString();} }

?

?

總結

以上是生活随笔為你收集整理的字符串类算法题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。