LeetCode 151/186 Reverse Words in a String I II


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".
  • What constitutes a word?
    A sequence of non-space characters constitutes a word.
  • Could the input string contain leading or trailing spaces?
    Yes. However, your reversed string should not contain leading or trailing spaces.
  • How about multiple spaces between two words?
    Reduce them to a single space in the reversed string.
  • 题目大意:给定一个字符串,对字符串进行逆转。
  • 解题思路:看到这道题目有两种思路:
X. 1)用两个指针从前到后扫描,分开单词,先对每个单词进行逆转,最后再对整个字符串逆转;
比如题目中给的例子:先对每个单词进行逆转得到的结果:"eht yks si eulb",然后再整体逆转即可得到"blue is sky the"。
X. 2)根据空格切分字符串,将切分得到的单词存到vector中,然后将vector中的单词从末尾开始输出即可。
在衡量了两种方法之后,觉得第二种方法代码更加简洁方便,便选择了第二种思路。   
 public String reverseWords(String s) {
  if (s == null || s.length() == 0) {
   return "";
  }
 
  // split to words by space
  String[] arr = s.split(" ");
  StringBuilder sb = new StringBuilder();
  for (int i = arr.length - 1; i >= 0; --i) {
   if (!arr[i].equals("")) {
    sb.append(arr[i]).append(" ");
   }
  }
  return sb.length() == 0 ? "" : sb.substring(0, sb.length() - 1);
 }

    void reverseWords(string &s) {
        string ret;
        int j = s.size();
        for(int i=s.size()-1; i>=0; i--) {
            if(s[i]==' ')
                j = i;
            else if(i==0 || s[i-1]==' ') {
                if(!ret.empty()) ret.append(" ");
                ret.append(s.substr(i, j-i));
            }
        }
        s = ret;
    }
public String reverseWords(String s) {
  String[] a = s.split(" ");
  StringBuilder sb = new StringBuilder();
  for (int i = a.length - 1; i >= 0; i--) {
    if (!a[i].equals("")) {
      sb.append(a[i]);
      sb.append(" ");
    }
  }
  if (sb.length() > 1)
    sb.deleteCharAt(sb.length() - 1);
  return sb.toString();
}

public String reverseWords(String s) {
  StringBuilder reversed = new StringBuilder();
  int j = s.length();
  for (int i = s.length() - 1; i >= 0; i--) {
    if (s.charAt(i) == ' ') {
      j = i;
    }
    else if (i == 0 || s.charAt(i - 1) == ' ') {
      if (reversed.length() != 0)
        reversed.append(' ');
      reversed.append(s.substring(i, j)); // substring is not efficient
    }
  }
  return reversed.toString();
}

public String reverseWords(String s) {
  char a[] = s.toCharArray();
  reverse(a, 0, a.length);
  for (int i = 0, j = 0; j <= a.length; j++) {
    if (j == a.length || a[j] == ' ') {
      reverse(a, i, j);
      i = j + 1;
    }
  }
  return new String(a);
}
private void reverse(char[] s, int begin, int end) {
  for (int i = 0; i < (end - begin) / 2; i++) {
    char temp = s[begin + i];
    s[begin + i] = s[end - i - 1];
    s[end - i - 1] = temp;
  }
}
GoLang:
https://github.com/Max-Liu/Leetcode-in-golang/blob/master/reverse-words-in-a-string/main.go
import (
  "fmt"
  "strings"
)
func main() {
  str := "the sky is blue 111"
  fmt.Println(reverseWordsInAString(str))
}

func reverseWordsInAString(str string) (finalStr string) {

  strSlice := strings.Split(str, " ")
  strLen := len(strSlice)

  var halfStrSlice []string

  if strLen%2 == 0 {
    halfStrSlice = strSlice[:strLen/2]
  } else {
    halfStrSlice = strSlice[:(strLen-1)/2]
  }

  for key, value := range halfStrSlice {
    temp := value
    strSlice[key] = strSlice[strLen-key-1]
    finalStr = finalStr + strSlice[strLen-key-1] + " "
    strSlice[strLen-key-1] = temp
  }

  for _, value := range strSlice[len(halfStrSlice):] {
    finalStr += value + " "
  }

  return finalStr
}
[LeetCode] Reverse Words in a String II | 程序员达达
跟Reverse Words in a String很类似,但是这里要求in-place,也就是说不需要开辟额外空间。

该题在LeetCode中假设开头和结尾没有空格,而且单词之间只有一个空格。但其实不需要这些假设也是可以的,就是代码会比较复杂。
思路就是两步走,第一步就是将整个字符串翻转。然后从头逐步扫描,将每个遇到单词再翻转过来。
[注意事项]
1)如果是Java,应该跟面试官指出String是immutable,所以需要用char array来做。
2)follow-up问题:k-step reverse。也就是在第二部翻转的时候,把k个单词看作一个长单词,进行翻转。

    public void reverseWords(char[] s) {
        reverse(s, 0, s.length);
        for (int i=0, j=0; j<=s.length; j++) {
            if (j==s.length || s[j]==' ') {
                reverse(s, i, j);
                i =  j + 1;
            }
        }
    }
 
    private void reverse(char [] s, int begin, int end) {
        for (int i=0; i<(end-begin)/2; i++) {
            char temp = s[begin+i];
            s[begin+i] = s[end-i-1];
            s[end-i-1] = temp;
        }
    }
https://www.cnblogs.com/EdwardLiu/p/4306561.html
这道题要求in-place做法,不能使用extra space, 那么,做法跟Rotate Array那道题非常相似
(1)reverse the whole array
(2)reverse each subarray seperated by ' '
注意不要忘了reverse最后一个word
 1 public void reverseWords(char[] s) {
 2     // Three step to reverse
 3     // 1, reverse the whole sentence
 4     reverse(s, 0, s.length - 1);
 5     // 2, reverse each word
 6     int start = 0;
 7     int end = -1;
 8     for (int i = 0; i < s.length; i++) {
 9         if (s[i] == ' ') {
10             reverse(s, start, i - 1);
11             start = i + 1;
12         }
13     }
14     // 3, reverse the last word, if there is only one word this will solve the corner case
15     reverse(s, start, s.length - 1);
16 }
17 
18 public void reverse(char[] s, int start, int end) {
19     while (start < end) {
20         char temp = s[start];
21         s[start] = s[end];
22         s[end] = temp;
23         start++;
24         end--;
25     }
26 }
http://www.1point3acres.com/bbs/thread-132725-1-1.html
一开始对方先简单的介绍自己, 然后轮到我简单的介绍自己, 接着挑了一个自己的项目介绍.

紧接着是算法. 对方先出了一道题, 问我见过没有. 我表示我见过... (Word break LC原题) 于是对方又换了一道题 (Reverse Words in a String II  还是LC原题). 但是这次就没有问我做过没有了, 简单讲解思路后麻利的写完, 并且写了简单的case测试. 途中也讨论了特殊情况并且印证结果 (比如leading & trailing space的处理). Follow up是加入符号但是reverse的时候需要保留位置. 我大概讲了一下想到的两种思路, 不是最优, 并且由于时间不够, 也没有写完. 面试官最后提了一下最优思路(用Double Stack)并且让我问了几个问题后就结束了.

http://betterpoetrythancode.blogspot.com/2015/02/reverse-words-in-string-ii-leetcode.html
Read full article from [LeetCode] Reverse Words in a String II | 程序员达达

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts