LeetCode 151. Reverse Words in a String
LeetCode 151. Reverse Words in a String (翻转字符串里的单词)
题目
链接
https://leetcode-cn.com/problems/reverse-words-in-a-string/
问题描述
给定一个字符串,逐个翻转字符串中的每个单词。
示例
输入: "the sky is blue"
输出: "blue is sky the"
提示
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
思路
造轮子,首先先去重首尾空格,然后处理中间的超过一个的空格,再转置。
需要转置两类,首先全体转置,之后每个单词转置,我在处理空格的时候处理了第一次转置,所以只需要对于每个单词转置即可。
复杂度分析
时间复杂度 O(n)
空间复杂度 O(n)
代码
Java
public static String reverseWords(String s) {
s = s.trim();
s=remove(s);
char[] c = s.toCharArray();
int pre = 0;
for (int i = 0; i < c.length; i++) {
if (c[i] == ' ') {
reverse(c, pre, i - 1);
pre = i + 1;
} else if (i == c.length - 1) {
reverse(c, pre, i);
}
}
return new String(c).trim();
}
public static String remove(String s) {
StringBuffer ss = new StringBuffer(s);
StringBuffer n = new StringBuffer();
if (ss.charAt(ss.length() - 1) != ' ') {
n.append(ss.charAt(ss.length() - 1));
}
for (int i = ss.length() - 2; i >= 0; i--) {
if (ss.charAt(i) == ' ' ) {
if( ss.charAt(i + 1) != ' ') {
n.append(' ');
}
}else {
n.append(ss.charAt(i));
}
}
return n.toString();
}
public static void reverse(char[] ch, int s, int e) {
while (s < e) {
char t = ch[s];
ch[s++] = ch[e];
ch[e--] = t;
}
}