题目描述:
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入: "Let's take LeetCode contest"
输出: "s'teL ekat edoCteeL tsetnoc"
解题思路:
- 首先写一个反转部分字符串的工具方法。
- 将字符串转换为字符数组。然后从前往后遍历,第一个不是空格的字符,或空格后面的第一个字符座位需要反转的字符串的首字符。最后一个不是空格字符或者空格的上一个非空格字符,作为需要反转的字符串的尾字符。然后进行对给字符串进行反转操作。
- 从前往后遍历,将所有被空格分开的字符串反转。
- 完成以上操作后,将字符数组转为字符串,然后返回该字符串。
实现过程:
//反转部分字符串的工具方法
public static void reverseString(char[] s, int l, int r) {
int n = s.length;
if (n <= 1) {
return;
}
while (l < r) {
char temp = s[l];
s[l] = s[r];
s[r] = temp;
l++;
r--;
}
}
public static String reverseWords(String s) {
if (s.equals("")) {
return "";
}
char[] arr = s.toCharArray();
int n = arr.length;
if (n <= 1) {
return null;
}
int l = 0;
int r = 0;
int i = 0;
while (i < n) {
//找到l的位置
for (; i < n; i++) {
if (arr[i] != ' ') {
l = i;
break;
}else {
i++;
}
}
//找到r的位置
while (i < n) {
if (i == n-1) {
r = n - 1;
reverseString(arr,l,r);
i++;
break;
}
if (arr[i] == ' ') {
r = i - 1;
reverseString(arr,l,r);
i++;
break;
}else {
i++;
}
}
}
return new String(arr);
}