diff --git a/dynamic_programming/decode_ways.py b/dynamic_programming/decode_ways.py new file mode 100644 index 000000000000..fcd80eb6ade0 --- /dev/null +++ b/dynamic_programming/decode_ways.py @@ -0,0 +1,47 @@ +""" +A message containing letters from A-Z is being encoded to numbers using the +following mapping: +'A' -> 1 +'B' -> 2 +... +'Z' -> 26 +Given a non-empty string containing only digits, +determine the total number of ways to decode it. +""" + +def num_decodings(s: str): + """ + >> num_decodings("12") + 2 + >> num_decodings("226") + 3 + """ + if not s or int(s[0]) == 0: + return 0 + + last = 1 + second_last = 1 + + for i in range(1, len(s)): + # 0 is a special digit since it does not + # correspond to any alphabet but can be + # meaningful if preceeded by 1 or 2 + + if s[i] == "0": + if s[i-1] in {"1", "2"}: + curr = second_last + else: + return 0 + elif 11 <= int(s[i-1:i+1]) <= 26: + curr = second_last + last + else: + curr = last + + last, second_last = curr, last + return last + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/strings/num_splits.py b/strings/num_splits.py new file mode 100644 index 000000000000..15ae482018ed --- /dev/null +++ b/strings/num_splits.py @@ -0,0 +1,44 @@ +""" +You are given a string s, a split is called good if you can split s into +2 non-empty strings p and q where its concatenation is equal to s and +the number of distinct letters in p and q are the same. + +Return the number of good splits you can make in s. +""" +from collections import Counter, defaultdict + +def num_splits(self, s: str): + """ + >> num_splits("aacaba") + 2 + >> num_splits("abcd") + 1 + >> num_splits("aaaaa") + 4 + """ + ans = 0 + rightSplit = Counter(s) + leftSplit = defaultdict(int) + + leftCount = 0 + rightCount = len(rightSplit) + + for ch in s: + rightSplit[ch] -= 1 + leftSplit[ch] += 1 + + if rightSplit[ch] == 0: + rightCount -= 1 + + leftCount = len(leftSplit) + + if leftCount == rightCount: + ans += 1 + + return ans + + +if __name__ == "__main__": + import doctest + + doctest.testmod()