151.翻转字符串里的单词
力扣题目链接
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
双指针思路:先全部翻转,再逐个翻转单词;因为要去除空格,所以我们先移除多余空格
Java代码:
class Solution {public String reverseWords(String s) {StringBuilder sb = removeSpace(s);reverseString(sb, 0, sb.length() - 1);reverseEachWord(sb);return sb.toString();}private StringBuilder removeSpace(String s) {StringBuilder sb = new StringBuilder();int start = 0;int end = s.length() - 1;// 去除首尾空格while(s.charAt(start) == ' ') start++;while(s.charAt(end) == ' ') end--;while(start <= end) {char ch = s.charAt(start);if(ch != ' ' || (sb.length() > 0 && sb.charAt(sb.length() - 1) != ' ')) {sb.append(ch);}start++;}return sb;}private void reverseString(StringBuilder sb, int start, int end) {while(start < end) {char temp = sb.charAt(end);sb.setCharAt(end, sb.charAt(start));sb.setCharAt(start, temp);start++;end--;}}private void reverseEachWord(StringBuilder sb) {int start = 0;int end = 0;while(start < sb.length()) {while(end < sb.length() && sb.charAt(end) != ' ') end++;// reverse wordreverseString(sb, start, end - 1);start = end + 1;end = start;}}
}