给你一个字符串
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 <= 104
s
包含英文大小写字母、数字和空格' '
s
中 至少存在一个 单词进阶:如果字符串在你使用的编程语言中是一种可变数据类型,请尝试使用
O(1)
额外空间复杂度的 原地 解法。
java 解题以及思路
package com.java.leetcode.string;
import java.util.Arrays;
/**
*题目描述
* 给你一个字符串 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 <= 104
* s 包含英文大小写字母、数字和空格 ' '
* s 中 至少存在一个 单词
*
*
* 进阶:如果字符串在你使用的编程语言中是一种可变数据类型,请尝试使用 O(1) 额外空间复杂度的 原地 解法。给你一个字符串 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 <= 104
* s 包含英文大小写字母、数字和空格 ' '
* s 中 至少存在一个 单词
*
*
* 进阶:如果字符串在你使用的编程语言中是一种可变数据类型,请尝试使用 O(1) 额外空间复杂度的 原地 解法。
*/
public class reverseWords151 {
/***
* 基础解法 split 字符串 判断空格 然后对字符串数组进行 交换即可
*
* @param s
* @return
*/
public String reverseWords(String s) {
String [] str=s.trim().split(" ");
int left=0;
int right=str.length-1;
while(left<right){
if((str[left]).trim().equals("")){
left++;
continue;
}
if((str[right]).trim().equals("")){
right--;
continue;
}
String tmp=str[left];
str[left]=str[right];
str[right]=tmp;
left++;
right--;
}
StringBuilder builder=new StringBuilder();
for(int i=0;i<str.length;i++){
builder.append(str[i]);
if(i<str.length-1&& !(str[i]).trim().equals("")){
builder.append(" ");
}
}
return builder.toString();
}
/**
*进阶:如果字符串在你使用的编程语言中是一种可变数据类型,请尝试使用 O(1) 额外空间复杂度的 原地 解法
*
* 即 不使用辅助空间,空间复杂度要求为O(1)
*
*/
public String reverseWords2(String s) {
/**
* 思路
* 1、去除前后空格和字符串中间多余空格
* 2、翻转整个字符串
* 3、再反转所有单词 即可 完成要求的翻转过程
*/
StringBuilder sb=removeSpace(s);
StringReverse(sb,0,sb.length()-1);
reverseWords(sb);
return sb.toString();
}
/**
* 剔除多余空格
* @param str
* @return
*/
public StringBuilder removeSpace(String str){
/**
* 双指针法去剔除多与空格
*/
int left=0;
int right=str.length()-1;
while(str.charAt(left)==' '){
left++;
}
while(str.charAt(right)==' '){
right--;
}
StringBuilder sb=new StringBuilder();
while(left<=right){
if(str.charAt(left)!=' '|| sb.charAt(sb.length() - 1) != ' '){
sb.append(str.charAt(left));
}
left++;
}
return sb;
}
/**
* 翻转字符串
* @param sb
* @param start
* @param end
* @return
*/
public void StringReverse(StringBuilder sb,int start,int end){
/**
* 对指定空间的字符串进行翻转
*/
if(start<0||end<=0||(end<=start)){
return ;
}
while(start<end){
char c=sb.charAt(start);
sb.setCharAt(start,sb.charAt(end));
sb.setCharAt(end,c);
start++;
end--;
}
}
/**
* 反转单词
*
* @param sb
* @return
*/
public void reverseWords(StringBuilder sb){
int left=0;
int right;
for(int i=0;i<sb.length();i++){
if(sb.charAt(i)==' '|| i==sb.length()-1){
right=i==sb.length()-1?i:i-1;
StringReverse(sb,left,right);
left=i+1;
}
}
}
public static void main(String[] args) {
reverseWords151 yy=new reverseWords151();
String str=yy.reverseWords2("the sky is blue");
System.out.println(str);
}
}