以下解題思路來自代碼隨想錄以及官方題解。
文章目錄
- 344.反轉字符串
- 541.反轉字符串||
- 151.反轉字符串中的單詞
- 28.找出字符串中第一個匹配項的下標
- 459.重復的字符串
344.反轉字符串
編寫一個函數,其作用是將輸入的字符串反轉過來。輸入字符串以字符數組 s
的形式給出。
不要給另外的數組分配額外的空間,你必須原地修改輸入數組、使用 O(1) 的額外空間解決這一問題。
輸入:s = ["h","e","l","l","o"]
輸出:["o","l","l","e","h"]輸入:s = ["H","a","n","n","a","h"]
輸出:["h","a","n","n","a","H"]
這道題很簡單,沒什么難度。
class Solution {public void reverseString(char[] s) {int left = 0;int right = s.length - 1;while (left < right) {char temp = s[left];s[left] = s[right];s[right] = temp;left++;right--;}}
}
541.反轉字符串||
給定一個字符串 s 和一個整數 k,從字符串開頭算起, 每計數至 2k 個字符,就反轉這 2k 個字符中的前 k 個字符。
- 如果剩余字符少于 k 個,則將剩余字符全部反轉。
- 如果剩余字符小于 2k 但大于或等于 k 個,則反轉前 k 個字符,其余字符保持原樣。
輸入:s = "abcdefg", k = 2
輸出:"bacdfeg"輸入:s = "abcd", k = 2
輸出:"bacd"
class Solution {public String reverseStr(String s, int k) {char[] ch = s.toCharArray();for (int i = 0; i < ch.length; i = i + 2 * k) {// 如果剩余字符小于 2k 但大于或等于 k 個,則反轉前 k 個字符,其余字符保持原樣。if (i + k <= ch.length) {reverse(ch, i, i + k - 1);continue;}// 如果剩余字符少于 k 個,則將剩余字符全部反轉。reverse(ch, i, ch.length - i);}return new String(ch);}public void reverse(char[] ch, int start, int end) {while (start < end) {char temp = ch[start];ch[start] = ch[end];ch[end] = temp;start++;end--;}}}
151.反轉字符串中的單詞
給你一個字符串 s
,請你反轉字符串中 單詞 的順序。
單詞是由非空格字符組成的字符串。s
中使用至少一個空格將字符串中的單詞分隔開。
返回單詞順序顛倒且單詞之間用單個空格連接的結果字符串。
注意:輸入字符串 s
中可能會存在前導空格、尾隨空格或者單詞間的多個空格。返回的結果字符串中,單詞間應當僅用單個空格分隔,且不包含任何額外的空格。
輸入:s = "the sky is blue"
輸出:"blue is sky the"輸入:s = " hello world "
輸出:"world hello"
解釋:反轉后的字符串中不能存在前導空格和尾隨空格。輸入:s = "a good example"
輸出:"example good a"
解釋:如果兩個單詞間有多余的空格,反轉后的字符串需要將單詞間的空格減少到僅有一個。
以下是力扣官方題解
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);}
}
28.找出字符串中第一個匹配項的下標
給你兩個字符串 haystack
和 needle
,請你在 haystack
字符串中找出 needle
字符串的第一個匹配項的下標(下標從 0 開始)。如果 needle
不是 haystack
的一部分,則返回 -1 。
輸入:haystack = "sadbutsad", needle = "sad"
輸出:0
解釋:"sad" 在下標 0 和 6 處匹配。
第一個匹配項的下標是 0 ,所以返回 0 。輸入:haystack = "leetcode", needle = "leeto"
輸出:-1
解釋:"leeto" 沒有在 "leetcode" 中出現,所以返回 -1 。
我自己的解法
class Solution {public int strStr(String haystack, String needle) {if (haystack.length() < needle.length()) {return -1;}int len = needle.length();int i = 0;while (i + len <= haystack.length()) {if (haystack.substring(i, i + len).equals(needle)) {return i;}i++;}return -1;}
}
官方的暴力解法
class Solution {public int strStr(String haystack, String needle) {int n = haystack.length(), m = needle.length();for (int i = 0; i + m <= n; i++) {boolean flag = true;for (int j = 0; j < m; j++) {if (haystack.charAt(i + j) != needle.charAt(j)) {flag = false;break;}}if (flag) {return i;}}return -1;}
}
459.重復的字符串
給定一個非空的字符串 s
,檢查是否可以通過由它的一個子串重復多次構成。
輸入: s = "abab"
輸出: true
解釋: 可由子串 "ab" 重復兩次構成。輸入: s = "aba"
輸出: false輸入: s = "abcabcabcabc"
輸出: true
解釋: 可由子串 "abc" 重復四次構成。 (或子串 "abcabc" 重復兩次構成。)
解題思路我們重復的拼接,然后截取字符串長度看是否包含自身字符串。
class Solution {public boolean repeatedSubstringPattern(String s) {String str = s + s;return str.substring(1, str.length() - 1).contains(s);}
}