Welcome to Subscribe On Youtube

3597. Partition String

Description

Given a string s, partition it into unique segments according to the following procedure:

  • Start building a segment beginning at index 0.
  • Continue extending the current segment character by character until the current segment has not been seen before.
  • Once the segment is unique, add it to your list of segments, mark it as seen, and begin a new segment from the next index.
  • Repeat until you reach the end of s.

Return an array of strings segments, where segments[i] is the ith segment created.

 

Example 1:

Input: s = "abbccccd"

Output: ["a","b","bc","c","cc","d"]

Explanation:

Index Segment After Adding Seen Segments Current Segment Seen Before? New Segment Updated Seen Segments
0 "a" [] No "" ["a"]
1 "b" ["a"] No "" ["a", "b"]
2 "b" ["a", "b"] Yes "b" ["a", "b"]
3 "bc" ["a", "b"] No "" ["a", "b", "bc"]
4 "c" ["a", "b", "bc"] No "" ["a", "b", "bc", "c"]
5 "c" ["a", "b", "bc", "c"] Yes "c" ["a", "b", "bc", "c"]
6 "cc" ["a", "b", "bc", "c"] No "" ["a", "b", "bc", "c", "cc"]
7 "d" ["a", "b", "bc", "c", "cc"] No "" ["a", "b", "bc", "c", "cc", "d"]

Hence, the final output is ["a", "b", "bc", "c", "cc", "d"].

Example 2:

Input: s = "aaaa"

Output: ["a","aa"]

Explanation:

Index Segment After Adding Seen Segments Current Segment Seen Before? New Segment Updated Seen Segments
0 "a" [] No "" ["a"]
1 "a" ["a"] Yes "a" ["a"]
2 "aa" ["a"] No "" ["a", "aa"]
3 "a" ["a", "aa"] Yes "a" ["a", "aa"]

Hence, the final output is ["a", "aa"].

 

Constraints:

  • 1 <= s.length <= 105
  • s contains only lowercase English letters.

Solutions

Solution 1: Hash Table + Simulation

We can use a hash table $\textit{vis}$ to record the segments that have already appeared. Then, we traverse the string $s$, building the current segment $t$ character by character until this segment has not appeared before. Each time we construct a new segment, we add it to the result list and mark it as seen.

After the traversal, we simply return the result list.

The time complexity is $O(n \times \sqrt{n})$, and the space complexity is $O(n)$, where $n$ is the length of the string $s$.

  • class Solution { public List<String> partitionString(String s) { Set<String> vis = new HashSet<>(); List<String> ans = new ArrayList<>(); String t = ""; for (char c : s.toCharArray()) { t += c; if (vis.add(t)) { ans.add(t); t = ""; } } return ans; } } 
  • class Solution { public: vector<string> partitionString(string s) { unordered_set<string> vis; vector<string> ans; string t = ""; for (char c : s) { t += c; if (!vis.contains(t)) { vis.insert(t); ans.push_back(t); t = ""; } } return ans; } }; 
  • class Solution: def partitionString(self, s: str) -> List[str]: vis = set() ans = [] t = "" for c in s: t += c if t not in vis: vis.add(t) ans.append(t) t = "" return ans 
  • func partitionString(s string) (ans []string) { vis := make(map[string]bool) t := "" for _, c := range s { t += string(c) if !vis[t] { vis[t] = true ans = append(ans, t) t = "" } } return } 
  • function partitionString(s: string): string[] { const vis = new Set<string>(); const ans: string[] = []; let t = ''; for (const c of s) { t += c; if (!vis.has(t)) { vis.add(t); ans.push(t); t = ''; } } return ans; } 

All Problems

All Solutions