题目描述:
标签:双指针 字符串
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。
说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
代码:
思路分析:
这题和LeetCode151题翻转字符串里的单词相似。
1、先对字符串前面或后面有多余空格进行处理,使用trim()方法
2、再对两个单词间的多余空格进行处理,使用replaceAll()方法,还要熟悉一下正则表达式的写法
3、最后,先对每个单词进行翻转,即定义双指针i、j,i指向每个单词的头部,j指向每个单词的尾部的后一个位置,所以当j指向的位置为空格或者是n时reverse(s,i,j-1),然后更新i=j+1,j++。
4、最后对整个字符串进行翻转
class Solution {
public String reverseWords(String s) {
s = s.trim();
s = s.replaceAll("\\s{2,}"," ");
int n = s.length();
char[] ch = s.toCharArray();
int i = 0;
int j = 0;
while(j <= n){
if(j == n || ch[j] == ' '){
reverse(ch, i , j - 1);
i = j + 1;
}
j++;
}
reverse(ch, 0, n - 1);
return new String(ch);
}
public void reverse(char[] ch,int i,int j){
while(i < j){
swap(ch, i++, j--);
}
}
public void swap(char[] ch, int index1, int index2){
char tmp = ch[index1];
ch[index1] = ch[index2];
ch[index2] = tmp;
}
}