题目链接
创建新字符数组填充。时间复杂度O(n)
class Solution {
public String reverseWords(String s) {
char arr[]=s.toCharArray();
char newArr[] = new char[arr.length + 1];
int newArrPos = 0;
int i = arr.length - 1;
while(i >= 0){
while(i >= 0 && arr[i] == ' '){
i--;
}
int right = i;
while(i >= 0 && arr[i] != ' '){
i--;
}
for(int j = i + 1; j <= right; j++){
newArr[newArrPos++] = arr[j];
if(j == right){
newArr[newArrPos++] = ' ';
}
}
}
if(arr.length == 0){
return s;
}else{
return new String(newArr, 0, newArrPos - 1);
}
}
}
双指针移除多余空格,将整个字符串反转,把单词逐个反转
class Solution {
public String reverseWords(String s) {
StringBuilder sb = trimSpaces(s);
reverse(sb, 0, sb.length() - 1);
reverseEachWord(sb);
return sb.toString();
}
public StringBuilder trimSpaces(String s) {
int left = 0, right = s.length() - 1;
while (left <= right && s.charAt(left) == ' ') {
++left;
}
while (left <= right && s.charAt(right) == ' ') {
--right;
}
StringBuilder sb = new StringBuilder();
while (left <= right) {
char c = s.charAt(left);
if (c != ' ') {
sb.append(c);
} else if (sb.charAt(sb.length() - 1) != ' ') {
sb.append(c);
}
++left;
}
return sb;
}
public void reverse(StringBuilder sb, int left, int right) {
while (left < right) {
char tmp = sb.charAt(left);
sb.setCharAt(left++, sb.charAt(right));
sb.setCharAt(right--, tmp);
}
}
public void reverseEachWord(StringBuilder sb) {
int n = sb.length();
int start = 0, end = 0;
while (start < n) {
while (end < n && sb.charAt(end) != ' ') {
++end;
}
reverse(sb, start, end - 1);
start = end + 1;
++end;
}
}
}
作者:力扣官方题解
链接:https://leetcode.cn/problems/reverse-words-in-a-string/solutions/194450/fan-zhuan-zi-fu-chuan-li-de-dan-ci-by-leetcode-sol/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。