给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
复制代码
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
复制代码
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
复制代码
说明:
- 无空格字符构成一个单词。
- 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
- 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
进阶:
请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。
解体思路: 先将整个字符串反转,再逐个翻转字符串,最后去除多余的 ' ' 字符
class Solution { public String reverseWords(String s){
char[] chs = s.toCharArray();
reverse( chs , 0 , chs.length -1 );
for(int i = 0 ; i < chs.length ; ){
if( chs[ i ] == ' ' ){
i++;
continue;
}
int j = i + 1;
for( ; j < chs.length; j++){
if( chs[ j ] == ' ' ){
break;
}
}
reverse( chs , i , j - 1 );
i = j ;
}
return trim( chs );
}
public void reverse( char[] chs ,int begin ,int end){
while (begin < end){
char ch = chs[ begin ];
chs[begin] = chs[end];
chs[end] = ch;
begin++;
end--;
}
}
public String trim( char[] chs ){
int i = 0 , j = 0;
while( i < chs.length ){
if( chs[ i ] == ' ' ){
i++;
continue;
}
while(i < chs.length && chs[i] != ' ' ){
chs[j++] = chs[i++];
}
while(i < chs.length && chs[ i ] == ' ' ){
i++;
}
if( i < chs.length )
chs[j++] = ' ';
}
return new String(chs).substring( 0 , j );
}
复制代码
}