标签:
题目链接: https://oj.leetcode.com/problems/reverse-words-in-a-string/
问题:
Given an input string, reverse the string word by word.
For example,
Given s = "the sky is blue",
return "blue is sky the”.
针对本题可能存在的疑惑:
1)单词的组成结构?
不包含空格的字符序列
2)tab和换行是否作为空格进行操作?
假设输入不包含tab和换行
3)输入字符串的首尾是否能够包含空格?
可以包括,但是反转后的字符串的首尾不包含空格
4)如果在两个单词之间包含多个空格如何处理?
将多个空格减少到1个
解题思路:
思路一:根据空格切分字符串,将切分得到的子串(单词)逆序存入新开辟的字符串中。
方法:
指针i从字符串的尾部向头部移动
a. 如果i指向的字符不为’’ ’’,
a)若i-1指向的也不为“ ”,i—
b)若i-1指向的字符为“ ”,
如果新的字符串为空,直接将尾部的单词存入,否则存入“ ”+ 尾部的单词
b. 如果i指向的字符为’’ ’’,将字符串缩短为
1 public String reverseWords(String s) { 2 StringBuilder reversed = new StringBuilder(); 3 int strLen = s.length(); 4 for(int i = s.length() - 1; i >= 0; i--){ 5 if(s.charAt(i) == ‘ ‘){ 6 strLen = i; 7 }else if(i == 0 || s.charAt(i-1) == ‘ ‘){ 8 if(reversed.length() != 0){ 9 reversed.append(‘ ‘); 10 } 11 reversed.append(s.substring(i,strLen)); 12 } 13 } 14 return reversed.toString(); 15 }
时间复杂度O(n),空间复杂度O(n)
思路二:先对每个单词进行逆转,然后对整个字符串进行逆转
(若要满足条件4),输入字符串中每两个单词中只有一个空格间隔);
方法:
先对每个单词进行逆转,得到结果“eht yks si eulb",然后再整体逆转即可得到"blue is sky the”。
1 public void reverseWords(char[] s){ 2 for (int i = 0, j = 0; j <= s.length; j++) { 3 if (j == s.length || s[j] == ‘ ‘) { 4 reverse(s, i, j); 5 i = j + 1; 6 } 7 } 8 reverse(s, 0, s.length); 9 } 10 11 private void reverse(char[] s, int begin, int end){ 12 for(int i = 0; i < (end - begin)/2; i++){ 13 char temp = s[begin + i]; 14 s[begin + i] = s[end - i - 1]; 15 s[end - i - 1] = temp; 16 } 17 }
优点:不需要分配额外空间,时间复杂度O(N), 空间复杂度O(1)
[LeetCode] Reverse Words in a String
标签:
原文地址:http://www.cnblogs.com/momo-fun/p/5779472.html