package LeetCode_408
/**
* 408. Valid Word Abbreviation
* (Prime)
* 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.
* */
class Solution {
/*
* solution: Sliding-Window, Time complexity:O(n), Space complexity:O(1)
* */
fun isValidAbberviation(s: String?, abbr: String?): Boolean {
if (s == null || abbr == null) {
return false
}
if (s.length == abbr.length && s != abbr) {
return false
}
//calculate the total length than compare both
val charArray = abbr.toCharArray()
val length = charArray.size
var count = 0
var right = 0
var i = 0
while (i < length) {
if (charArray[i].isDigit()) {
right = i
while (charArray[right].isDigit()) {
right++
if (right >= length) {
break
}
}
val countString = abbr.substring(i, right)
count += countString.toInt()
//update the index
i = right - 1
} else {
count++
}
i++
}
return count == s.length
}
}