Partition String

medium trie string simulation

Problem

Partition a string s into unique segments. Start a segment at index 0 and keep extending it character by character. The moment the current segment has not been seen before, add it to the answer, mark it as seen, and begin a fresh segment from the next index. Repeat until you reach the end of s, then return the list of segments.

Inputs = "abbccccd"
Output["a","b","bc","c","cc","d"]
"a", "b" are new. At index 2 "b" was already seen, so we extend to "bc" (new). Then "c" is new; at index 5 "c" repeats so we extend to "cc" (new); finally "d" is new.

def partitionString(s):
    seen = set()          # every segment already emitted
    segments = []         # the answer
    cur = ""              # segment being built
    for ch in s:
        cur += ch         # extend current segment
        if cur not in seen:
            segments.append(cur)   # it is unique -> emit it
            seen.add(cur)          # mark it seen
            cur = ""               # start a fresh segment
    return segments
function partitionString(s) {
  const seen = new Set();   // every segment already emitted
  const segments = [];      // the answer
  let cur = "";             // segment being built
  for (const ch of s) {
    cur += ch;              // extend current segment
    if (!seen.has(cur)) {
      segments.push(cur);   // it is unique -> emit it
      seen.add(cur);        // mark it seen
      cur = "";             // start a fresh segment
    }
  }
  return segments;
}
List<String> partitionString(String s) {
    Set<String> seen = new HashSet<>();   // segments already emitted
    List<String> segments = new ArrayList<>();
    StringBuilder cur = new StringBuilder();
    for (char ch : s.toCharArray()) {
        cur.append(ch);                   // extend current segment
        String seg = cur.toString();
        if (!seen.contains(seg)) {
            segments.add(seg);            // unique -> emit it
            seen.add(seg);                // mark it seen
            cur.setLength(0);             // start a fresh segment
        }
    }
    return segments;
}
vector<string> partitionString(string s) {
    unordered_set<string> seen;   // segments already emitted
    vector<string> segments;
    string cur = "";              // segment being built
    for (char ch : s) {
        cur += ch;                // extend current segment
        if (!seen.count(cur)) {
            segments.push_back(cur);  // unique -> emit it
            seen.insert(cur);         // mark it seen
            cur = "";                 // start a fresh segment
        }
    }
    return segments;
}
Time: O(n · L) Space: O(total segment length)