反转字符
344. 反转字符串 - 力扣(LeetCode)
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Solution { public void reverseString(char[] s) { int r = s.length - 1; int l = 0; while(l < r){ s[l] ^= s[r]; s[r] ^= s[l]; s[l] ^= s[r]; l++; r--; } } }
|
541. 反转字符串 II - 力扣(LeetCode)
每次只操作i + 2*k个数目的字符(其实是 i + k个数目的字符),直到最后不到2k个字符为止
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution { public String reverseStr(String s, int k) { int n = s.length(); char[] arr = s.toCharArray(); for(int i = 0; i < n; i += 2*k){ reverseString(arr, i, Math.min(i + k, n) - 1); } return new String(arr); } public void reverseString(char[] s, int l, int r) { while (l < r) { s[l] ^= s[r]; s[r] ^= s[l]; s[l] ^= s[r]; l++; r--; } } }
|
557. 反转字符串中的单词 III - 力扣(LeetCode)
- 总的来说这种写法比较考验脑子尤其在于对于字符串中的单一单词逆序的处理 i - 1 + start - j(不提倡的写法)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public String reverseWords(String s) { int i = 0, n = s.length(); StringBuilder bs = new StringBuilder(); while(i < n){ int start = i; while(i < n && s.charAt(i) != ' ') i++; for (int j = start; j < i; j++) bs.append(s.charAt(i - 1 + start - j)); while(i < n && s.charAt(i) == ' '){ bs.append(' '); i++; } } return bs.toString(); } }
|
这种方法可以经常练习一下双指针的操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Solution { public String reverseWords(String s) { StringBuilder ret = new StringBuilder(); int l = 0, r = 0, n = s.length(); while (r < n) { if (s.charAt(r) == ' ') { StringBuilder tmp = new StringBuilder(s.substring(l, r)); ret.append(tmp.reverse()); ret.append(' '); l = r + 1; } r++; } StringBuilder tmp = new StringBuilder(s.substring(l, r)); ret.append(tmp.reverse()); return ret.toString(); } }
|
151. 反转字符串中的单词 - 力扣(LeetCode)
学习新API
1 2 3 4 5 6 7 8 9 10 11 12
| class Solution { public String reverseWords(String s) { s = s.trim(); List<String> wordList = Arrays.asList(s.split("\\s+")); Collections.reverse(wordList); return String.join(" ", wordList); } }
|
中心扩展法
5. 最长回文子串 - 力扣(LeetCode)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public String longestPalindrome(String s) { if (s == null || s.length() <= 1) return s; int strLen = s.length(); int maxStart = 0; int maxEnd = 0; int maxLen = 1; boolean[][] f = new boolean[strLen][strLen]; for (int r = 1; r < strLen; r++) { for (int l = 0; l < r; l++) { if (s.charAt(l) == s.charAt(r) && (r - l <= 2 || f[l + 1][r - 1])) { f[l][r] = true; if (r - l + 1 > maxLen) { maxLen = r - l + 1; maxStart = l; maxEnd = r; } } } } return s.substring(maxStart, maxEnd + 1); } }
|
647. 回文子串 - 力扣(LeetCode)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Solution { public int countSubstrings(String s) { int n = s.length(); int ans = 0; for (int i = 0; i < n; i++) { for (int j = 0; j <= i; j++) { String ss = s.substring(j, i + 1); if (ss.equals(new StringBuilder(ss).reverse().toString())) { ans++; } } } return ans; } }
|