LeetCode151,翻转字符串的单词,思想:先将字符串两边的空格去除,翻转整条字符串,翻转单词。
public class reserveString {
public static void main(String[] args) {
String s = " aaa ccc d! ";
System.out.println(reverseWords(s));
}
public static String reverseWords(String s) {
int left = 0,right = s.length()-1;
StringBuilder sb = trim(s,left,right);
reverseString(sb,0,sb.length()-1);
reverseEachWord(sb);
return sb.toString();
}
private static void reverseEachWord(StringBuilder sb) {
int start = 0,end = 0;
int n = sb.length();
while(start < n){
while(end < n && sb.charAt(end)!=' ') ++end;
reverseString(sb,start,end-1);
start = end + 1;
end++;
}
}
private static void reverseString(StringBuilder sb, int left, int right) {
while (left < right){
char temp = sb.charAt(left);
sb.setCharAt(left++,sb.charAt(right));
sb.setCharAt(right--,temp);
}
}
private static StringBuilder trim(String s, int left, int right) {
while (left<=right && s.charAt(left) == ' ') ++left;
while (left<=right && s.charAt(right) == ' ') --right;
StringBuilder sb = new StringBuilder();
while(left<=right){
char c = s.charAt(left);
if (c != ' ') sb.append(c);
else if(sb.charAt(sb.length()-1)!=' ') sb.append(c);
left++;
}
return sb;
}
}