LeetCode刷题24-字符串-151. 反转字符串中的单词
题目
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
**注意:**输入字符串 s 中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例1:
输入:s = “the sky is blue”
输出:“blue is sky the”
示例2:
输入:s = " hello world "
输出:“world hello”
解释:反转后的字符串中不能存在前导空格和尾随空格。
示例3:
输入:s = “a good example”
输出:“example good a”
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
提示:
- 1 <= s.length <= 1 0 4 10^4 104
- s 包含英文大小写字母、数字和空格 ’ ’
- s 中 至少存在一个 单词
代码
解法1
利用StringBuilder进行空格去除,之后利用 split() 方法按照空格将字符串进行分割,最后进行反转
class Solution {
public String reverseWords(String s) {
// 1. 去除多余空格
StringBuilder sb = removeSpace(s);
// 2. 按照空格进行字符串分割
String[] strArr = sb.toString().split(" ");
//3. 将各个单词进行反转
int start = 0;
int end = strArr.length - 1;
while(start < end) {
String tmp = strArr[start];
strArr[start] = strArr[end];
strArr[end] = tmp;
start++;
end--;
}
String result = "";
for(int i = 0; i < strArr.length - 1; i++) {
result += strArr[i] + " ";
}
result += strArr[strArr.length - 1];
return result;
}
public StringBuilder removeSpace(String s) {
int start = 0;
int end = s.length() - 1;
while(s.charAt(start) == ' ') {
start++;
}
while(s.charAt(end) == ' ') {
end--;
}
StringBuilder sb= new StringBuilder();
while(start <= end) {
char c = s.charAt(start);
if(c != ' ' || sb.charAt(sb.length() - 1) != ' ') {
sb.append(c);
}
start++;
}
return sb;
}
}
解法2
利用 StringBuilder 首先对字符串进行冗余空格去除,之后反转整个字符串,最后反转每个单词。
class Solution {
public String reverseWords(String s) {
// 1. 去除多余空格
StringBuilder sb = removeSpace(s);
// 2. 反转整个字符串
int start = 0;
int end = sb.length() - 1;
reverse(sb, start, end);
// 3. 反转每个单词
start = 0;
for(int i = 0; i < sb.length(); i++) {
if(sb.charAt(i) == ' ') {
reverse(sb, start, i - 1);
start = i + 1;
} else if(i == sb.length() - 1) {
reverse(sb, start, i);
}
}
return sb.toString();
}
public StringBuilder removeSpace(String s) {
int start = 0;
int end = s.length() - 1;
while(s.charAt(start) == ' ') {
start++;
}
while(s.charAt(end) == ' ') {
end--;
}
StringBuilder sb= new StringBuilder();
while(start <= end) {
char c = s.charAt(start);
if(c != ' ' || sb.charAt(sb.length() - 1) != ' ') {
sb.append(c);
}
start++;
}
return sb;
}
public void reverse(StringBuilder sb, int start, int end) {
if(start > end) {
return;
}
while(start < end) {
char tmp = sb.charAt(start);
sb.setCharAt(start, sb.charAt(end));
sb.setCharAt(end, tmp);
start++;
end--;
}
}
}