Check if an Original String Exists Given Two Encoded Strings

https://leetcode.com/problems/check-if-an-original-string-exists-given-two-encoded-strings/solutions/5626567/ez-python-solution/

An original string, consisting of lowercase English letters, can be encoded by the following steps:

Arbitrarily split it into a sequence of some number of non-empty substrings. Arbitrarily choose some elements (possibly none) of the sequence, and replace each with its length (as a numeric string). Concatenate the sequence as the encoded string. For example, one way to encode an original string "abcdefghijklmnop" might be:

Split it as a sequence: ["ab", "cdefghijklmn", "o", "p"]. Choose the second and third elements to be replaced by their lengths, respectively. The sequence becomes ["ab", "12", "1", "p"]. Concatenate the elements of the sequence to get the encoded string: "ab121p". Given two encoded strings s1 and s2, consisting of lowercase English letters and digits 1-9 (inclusive), return true if there exists an original string that could be encoded as both s1 and s2. Otherwise, return false.

Note: The test cases are generated such that the number of consecutive digits in s1 and s2 does not exceed 3.

Example 1:

Input: s1 = "internationalization", s2 = "i18n" Output: true Explanation: It is possible that "internationalization" was the original string.

  • "internationalization" -> Split: ["internationalization"] -> Do not replace any element -> Concatenate: "internationalization", which is s1.

  • "internationalization" -> Split: ["i", "nternationalizatio", "n"] -> Replace: ["i", "18", "n"] -> Concatenate: "i18n", which is s2 Example 2:

Input: s1 = "l123e", s2 = "44" Output: true Explanation: It is possible that "leetcode" was the original string.

  • "leetcode" -> Split: ["l", "e", "et", "cod", "e"] -> Replace: ["l", "1", "2", "3", "e"] -> Concatenate: "l123e", which is s1.

  • "leetcode" -> Split: ["leet", "code"] -> Replace: ["4", "4"] -> Concatenate: "44", which is s2. Example 3:

Input: s1 = "a5b", s2 = "c5b" Output: false Explanation: It is impossible.

  • The original string encoded as s1 must start with the letter 'a'.

  • The original string encoded as s2 must start with the letter 'c'.

Constraints:

  • 1 <= s1.length, s2.length <= 40

  • s1 and s2 consist of digits 1-9 (inclusive), and lowercase English letters only.

  • The number of consecutive digits in s1 and s2 does not exceed 3.

解题思路:

dfs+memo

  • State Tracking (diff):

    • diff tracks the difference in the length of substrings that have been skipped over due to digit expansions.

    • A positive diff means that s1 is ahead of s2 by diff characters, while a negative diff means that s2 is ahead by -diff characters.

  • Digit Handling:

    • The code carefully handles cases where a digit might represent a sequence of characters by iterating through possible digit lengths.

    • For each possible digit, it tries to match it against the other string's sequence.

  • Character Matching:

    • When both s1 and s2 have characters (not digits) and diff == 0, the code attempts to match the characters directly.

  • Recursive Exploration:

    • The function recursively explores all possible ways to align and match the strings. It returns True if a valid match is found, and False otherwise.

Last updated

Was this helpful?