Dada una cadena con espacios al principio y al final, déjele invertir la cadena. No puede haber espacios adicionales al principio y al final. Si son todos los espacios, devuelva la cadena original.
Por ejemplo, el
“student. a am I”
flip es“I am a student.”
Primero, se requiere preprocesamiento para determinar si la cadena de entrada tiene todos los espacios y, de ser así, generar la cadena directamente.
Divida cada palabra y luego use la palabra como unidad de inversión para obtener la cadena de resultado.
Una palabra es: desde el principio de un carácter que no es un espacio hasta el final del carácter anterior que es un espacio, es una palabra.
public class Solution {
public String ReverseSentence(String str) {
if(str == null) return str;
int len = str.length();
int i = 0;
while(i<len && str.charAt(i) == ' ') i++;
if(i == len) return str;
String res = "";
String tmp = "";
boolean hasWord = false; // 是否已经形成一个单词
for(int j = len-1; j >=0; j--){
if(str.charAt(j) != ' '){
tmp = str.charAt(j) + tmp;
hasWord = true;
}else if(str.charAt(j) == ' ' && hasWord == true){
res = res + tmp + " ";
tmp = ""; // 重置 tmp
hasWord = false; // 重置 hasWord
}
}
if(tmp != ""){
res += tmp;
}
return res;
}
}
Úselo para StringBuilder
lograr:
public class Solution {
public String ReverseSentence(String str) {
if(str == null) return str;
int len = str.length();
int i = 0;
while(i<len && str.charAt(i) == ' ') i++;
if(i == len) return str;
StringBuilder res = new StringBuilder();
StringBuilder tmp = new StringBuilder();
boolean hasWord = false;
for(int j = len-1; j >=0; j--){
if(str.charAt(j) != ' '){
tmp.insert(0,str.charAt(j));
hasWord = true;
}else if(str.charAt(j) == ' ' && hasWord == true){
res = res.append(tmp).append(" ");
//tmp = new StringBuilder();
tmp.delete(0, tmp.length()); // 这里用delete避免产生新的对象
hasWord = false;
}
}
if(tmp.length() != 0){
res.append(tmp);
}
str = res.toString();
return str;
}
}
Complejidad de tiempo: O (N)
Complejidad de espacio: O (N), debido a que no hay cambio en la cuerda original, se requiere espacio adicional