A string can be shortened by replacing any number of non-adjacent, non-empty substrings with their lengths (without leading zeros).
For example, the string "implementation" can be abbreviated in several ways, such as:
Invalid abbreviations include:
You are given a string named word and an abbreviation named abbr, return true if abbr correctly abbreviates word, otherwise return false.
A substring is a contiguous non-empty sequence of characters within a string.
Example 1:
Input: word = "apple", abbr = "a3e"
Output: trueExample 2:
Input: word = "international", abbr = "i9l"
Output: falseExample 3:
Input: word = "abbreviation", abbr = "abbreviation"
Output: trueConstraints:
1 <= word.length <= 100word is made up of only lowercase English letters.1 <= abbr.length <= 100abbr is made up of lowercase English letters and digits.abbr fit in a 32-bit integer.Before attempting this problem, you should be comfortable with:
We need to verify that the abbreviation correctly represents the word. The abbreviation contains letters and numbers, where numbers indicate how many characters to skip. We use two pointers to traverse both strings simultaneously. When we see a letter in the abbreviation, it must match the current character in the word. When we see a number, we parse the full number and skip that many characters in the word. A leading zero in any number makes the abbreviation invalid.
i for the word and j for the abbreviation.abbr[j] is '0', return false (leading zeros are invalid).abbr[j] is a letter:word[i] == abbr[j]. If not, return false.i and j.abbr[j] is a digit:i by that number (skip characters in the word).true if both pointers have reached the end of their respective strings.class Solution:
def validWordAbbreviation(self, word: str, abbr: str) -> bool:
n, m = len(word), len(abbr)
i = j = 0
while i < n and j < m:
if abbr[j] == '0':
return False
if word[i] == abbr[j]:
i, j = i + 1, j + 1
elif abbr[j].isalpha():
return False
else:
subLen = 0
while j < m and abbr[j].isdigit():
subLen = subLen * 10 + int(abbr[j])
j += 1
i += subLen
return i == n and j == mWhere and are the lengths of the strings and , respectively.
The abbreviation "a02b" is invalid because the number has a leading zero. Many solutions forget to check for this edge case. Before parsing a multi-digit number, always verify that the first digit is not '0'. A leading zero makes the abbreviation invalid regardless of the number's value.
After parsing a number from the abbreviation and advancing the word pointer, you must verify that the pointer does not exceed the word length. For example, with word = "hi" and abbr = "5", skipping 5 characters goes beyond the word's length. Always check i <= n after advancing, and ensure both pointers reach their respective ends simultaneously.