package com.fishercoder.solutions; /** * 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. */ public class _408 { public boolean validWordAbbreviation(String word, String abbr) { if (abbr.length() > word.length()) { return false; } else { char[] abbrChars = abbr.toCharArray(); char[] wordChars = word.toCharArray(); if (abbr.length() == word.length()) { boolean prevDigit = false; for (int i = 0, j = 0; i < abbrChars.length && j < wordChars.length; i++, j++) { if (Character.isDigit(abbrChars[i]) && !prevDigit) { prevDigit = true; if (Character.getNumericValue(abbrChars[i]) != 1) { return false; } } else if (Character.isDigit(abbrChars[i]) && prevDigit) { return false; } else if (abbrChars[i] != wordChars[j]) { return false; } else if (prevDigit) { prevDigit = false; } } return true; } else { StringBuilder stringBuilder = new StringBuilder(); boolean firstDigit = true; for (int i = 0, j = 0; i < abbrChars.length && j < wordChars.length; i++) { while (i < abbrChars.length && Character.isDigit(abbrChars[i])) { if (firstDigit && Character.getNumericValue(abbrChars[i]) == 0) { return false; } stringBuilder.append(abbrChars[i]); i++; firstDigit = false; } firstDigit = true; if (!stringBuilder.toString().isEmpty()) { int number = Integer.valueOf(stringBuilder.toString()); j += number; stringBuilder.setLength(0); } if ((i >= abbrChars.length && j < wordChars.length) || (i < abbrChars.length && j >= wordChars.length)) { return false; } if (i < abbrChars.length && j < wordChars.length && abbrChars[i] != wordChars[j]) { return false; } if (j > wordChars.length && i <= abbrChars.length) { return false; } j++; } return true; } } } }