-
Notifications
You must be signed in to change notification settings - Fork 43
/
valid-word-abbreviation.py
82 lines (65 loc) · 2.03 KB
/
valid-word-abbreviation.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
"""
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.
"""
# V0
# V1
# http://bookshadow.com/weblog/2016/10/02/leetcode-valid-word-abbreviation/
class Solution(object):
def validWordAbbreviation(self, word, abbr):
"""
:type word: str
:type abbr: str
:rtype: bool
"""
size = len(word)
cnt = loc = 0
for w in abbr:
if w.isdigit():
if w == '0' and cnt == 0:
return False
cnt = cnt * 10 + int(w)
else:
loc += cnt
cnt = 0
if loc >= size or word[loc] != w:
return False
loc += 1
return loc + cnt == size
# V2
# Time: O(n)
# Space: O(1)
class Solution(object):
def validWordAbbreviation(self, word, abbr):
"""
:type word: str
:type abbr: str
:rtype: bool
"""
i , digit = 0, 0
for c in abbr:
if c.isdigit():
if digit == 0 and c == '0':
return False
digit *= 10
digit += int(c)
else:
if digit:
i += digit
digit = 0
if i >= len(word) or word[i] != c:
return False
i += 1
if digit:
i += digit
return i == len(word)