Restore IP Addresses and Word Break II: Partition Backtracking

Sanjeev SharmaSanjeev Sharma
2 min read

Advertisement

Restore IP Addresses

Python Implementation

def restoreIpAddresses(s):
    result = []
    def bt(start, parts):
        if len(parts) == 4:
            if start == len(s):
                result.append('.'.join(parts))
            return
        for length in range(1, 4):
            if start + length > len(s): break
            seg = s[start:start+length]
            # No leading zeros; no value > 255
            if (len(seg) > 1 and seg[0] == '0') or int(seg) > 255:
                break
            parts.append(seg)
            bt(start + length, parts)
            parts.pop()
    bt(0, [])
    return result

print(restoreIpAddresses("25525511135"))
# ['255.255.11.135', '255.255.111.35']

# Word Break II: find all segmentations
def wordBreak(s, wordDict):
    word_set = set(wordDict)
    memo = {}
    def bt(start):
        if start in memo: return memo[start]
        if start == len(s): return [[]]
        result = []
        for end in range(start+1, len(s)+1):
            word = s[start:end]
            if word in word_set:
                for rest in bt(end):
                    result.append([word] + rest)
        memo[start] = result
        return result
    return [' '.join(sentence) for sentence in bt(0)]

print(wordBreak("catsanddog", ["cat","cats","and","sand","dog"]))
# ['cat sand dog', 'cats and dog']

C++ Implementation

#include <bits/stdc++.h>
using namespace std;

vector<string> restoreIpAddresses(string s) {
    vector<string> result;
    vector<string> parts;
    function<void(int)> bt = [&](int start) {
        if (parts.size() == 4) {
            if (start == (int)s.size()) result.push_back(parts[0]+"."+parts[1]+"."+parts[2]+"."+parts[3]);
            return;
        }
        for (int len = 1; len <= 3; len++) {
            if (start + len > (int)s.size()) break;
            string seg = s.substr(start, len);
            if ((seg.size() > 1 && seg[0]=='0') || stoi(seg) > 255) break;
            parts.push_back(seg);
            bt(start + len);
            parts.pop_back();
        }
    };
    bt(0);
    return result;
}
  • 93. Restore IP Addresses — this problem
  • 139. Word Break — DP (can segment or not)
  • 140. Word Break II — backtracking + memo (all segmentations)
  • 241. Different Ways to Add Parentheses — divide and conquer

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro