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; }