Use two pointers (one for word
, the other for abbreviation
) to traverse the two strings at the same time.
class Solution {
public boolean validWordAbbreviation(String word, String abbr) {
if (word == null && abbr == null) return true;
if (word == null || abbr == null) return false;
int i = 0;
int j = 0;
while (i < word.length() && j < abbr.length()) {
if (word.charAt(i) == abbr.charAt(j)) {
i++;
j++;
} else if (abbr.charAt(j) > '0' && abbr.charAt(j) <= '9') { // Corner case: If the number starts with '0', it's invalid.
int start = j;
while (j < abbr.length() && abbr.charAt(j) >= '0' && abbr.charAt(j) <= '9') {
j++;
}
int num = Integer.valueOf(abbr.substring(start, j));
i += num;
} else {
return false;
}
}
return (i == word.length()) && (j == abbr.length());
}
}