我一开始的想法是利用栈的先进后出的思想反转字符串即可,但是要注意特殊的输入用例,比如全部字符串字符为空,此时应返回原字符串即可,还有需要注意最后一个输出的子字符串(student)没有空格,因此最后一个子字符串可以不入队,当然也可以使用subString方法不返回最后一个空格。
记录split()方法:以某个符号分割字符串成为字符串数组
import java.util.Stack;
public class Solution {
public String ReverseSentence(String str) {
if(str==null||str.length()<=0){
return str;
}
String[] s=str.split(" ");//使用split来对字符串进行分割,这里使用空格进行分割
if(s.length==0)//如果该字符串中除空格外不存在字符,则分割后字符串数组为空,直接返回原字符串即可
return str;
Stack<String> res=new Stack<>();
String ans="";
for(int i=0;i<s.length;i++){
res.push(s[i]);
}
while(!res.isEmpty()){
ans+=res.pop();
ans+=" ";
}
return ans.substring(0,ans.length()-1);
}
}但这种方法利用了辅助空间,增加了空间复杂度。下面记录滑动窗口法:
1.将整个字符串反转
2.再逐个反转
最后需要把字符数组转化为字符串:String.valueOf(s);
import java.util.Stack;
public class Solution {
public String ReverseSentence(String str) {
if(str==null||str.length()<=0){
return str;
}
char[] s=str.toCharArray();
Reverse(0,str.length()-1,s);//整体反转
int l=0;
int r=0;
while(l<str.length()){
if(s[r]==' '){
Reverse(l,r-1,s);
r++;
l=r;
}
if(r==s.length-1){
Reverse(l,r,s);
break;
}
r++;
}
return String.valueOf(s);
}
private void Reverse(int l,int r,char[] s){
while(l<r)
{
char tmp=s[l];
s[l]=s[r];
s[r]=tmp;
l++;
r--;
}
}
}
京公网安备 11010502036488号