408. Valid Word Abbreviation

Description

Given a non-empty string s and an abbreviation abbr, return whether the string matches with the given abbreviation.

A string such as "word" contains only the following valid abbreviations:

["word", "1ord", "w1rd", "wo1d", "wor1", "2rd", "w2d", "wo2", "1o1d", "1or1", "w1r1", "1o2", "2r1", "3d", "w3", "4"]

Notice that only the above abbreviations are valid abbreviations of the string "word". Any other string is not a valid abbreviation of "word".

Note:
Assume s contains only lowercase letters and abbr contains only lowercase letters and digits.

Example 1:

Given s = "internationalization", abbr = "i12iz4n":

Return true.

Example 2:

Given s = "apple", abbr = "a2e":

Return false.

Solution

Two-pointer, O(n), S(1)

简单题,但是testcase有点坑,并没有保证abbr一定是合法的,例如:
"a"
"0a"
需要return false...

class Solution {
    public boolean validWordAbbreviation(String word, String abbr) {
        if (word == null || abbr == null) {
            return false;
        }
        
        int i = 0;
        int j = 0;
        int m = word.length();
        int n = abbr.length();
        
        while (j < n && i < m) {
            char c = abbr.charAt(j);
            
            if (Character.isLetter(c)) {
                if (word.charAt(i++) != abbr.charAt(j++)) {
                    return false;
                }
            } else {
                if (c == '0') { // leading 0 is invalid
                    return false;
                }
                
                int num = 0;
                while (j < n && Character.isDigit(abbr.charAt(j))) {
                    num = 10 * num + abbr.charAt(j++) - '0';
                }
                
                i += num;
            }
        }
        
        return j == n && i == m;
    }
}

你可能感兴趣的:(408. Valid Word Abbreviation)