forked from haoel/leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
NumberOfDifferentIntegersInAString.cpp
77 lines (73 loc) · 2.4 KB
/
NumberOfDifferentIntegersInAString.cpp
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
// Source : https://leetcode.com/problems/number-of-different-integers-in-a-string/
// Author : Hao Chen
// Date : 2021-03-28
/*****************************************************************************************************
*
* You are given a string word that consists of digits and lowercase English letters.
*
* You will replace every non-digit character with a space. For example, "a123bc34d8ef34" will become
* " 123 34 8 34". Notice that you are left with some integers that are separated by at least one
* space: "123", "34", "8", and "34".
*
* Return the number of different integers after performing the replacement operations on word.
*
* Two integers are considered different if their decimal representations without any leading zeros
* are different.
*
* Example 1:
*
* Input: word = "a123bc34d8ef34"
* Output: 3
* Explanation: The three different integers are "123", "34", and "8". Notice that "34" is only
* counted once.
*
* Example 2:
*
* Input: word = "leet1234code234"
* Output: 2
*
* Example 3:
*
* Input: word = "a1b01c001"
* Output: 1
* Explanation: The three integers "1", "01", and "001" all represent the same integer because
* the leading zeros are ignored when comparing their decimal values.
*
* Constraints:
*
* 1 <= word.length <= 1000
* word consists of digits and lowercase English letters.
******************************************************************************************************/
class Solution {
private:
bool isNumber(char ch) {
return (ch >='0' && ch <='9');
}
public:
int numDifferentIntegers(string word) {
word.push_back('z'); // add a char for edge case.
bool intStart = false; // a stat for control
int start = 0, len = 0;
unordered_map<string, bool> stat;
for(int i=0; i<word.size(); i++) {
if (!isNumber(word[i]) ) {
if (intStart) {
while(word[start]=='0') {
start++, len--;
}
stat[word.substr(start, len)] = true;
intStart=false;
}
continue;
}
if (intStart == false) {
intStart = true;
start = i;
len = 1;
}else {
len++;
}
}
return stat.size();
}
};