forked from haoel/leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
SplittingAStringIntoDescendingConsecutiveValues.cpp
100 lines (94 loc) · 3.17 KB
/
SplittingAStringIntoDescendingConsecutiveValues.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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// Source : https://leetcode.com/problems/splitting-a-string-into-descending-consecutive-values/
// Author : Hao Chen
// Date : 2021-05-03
/*****************************************************************************************************
*
* You are given a string s that consists of only digits.
*
* Check if we can split s into two or more non-empty substrings such that the numerical values of the
* substrings are in descending order and the difference between numerical values of every two
* adjacent substrings is equal to 1.
*
* For example, the string s = "0090089" can be split into ["0090", "089"] with numerical
* values [90,89]. The values are in descending order and adjacent values differ by 1, so this way is
* valid.
* Another example, the string s = "001" can be split into ["0", "01"], ["00", "1"], or ["0",
* "0", "1"]. However all the ways are invalid because they have numerical values [0,1], [0,1], and
* [0,0,1] respectively, all of which are not in descending order.
*
* Return true if it is possible to split s as described above, or false otherwise.
*
* A substring is a contiguous sequence of characters in a string.
*
* Example 1:
*
* Input: s = "1234"
* Output: false
* Explanation: There is no valid way to split s.
*
* Example 2:
*
* Input: s = "050043"
* Output: true
* Explanation: s can be split into ["05", "004", "3"] with numerical values [5,4,3].
* The values are in descending order with adjacent values differing by 1.
*
* Example 3:
*
* Input: s = "9080701"
* Output: false
* Explanation: There is no valid way to split s.
*
* Example 4:
*
* Input: s = "10009998"
* Output: true
* Explanation: s can be split into ["100", "099", "98"] with numerical values [100,99,98].
* The values are in descending order with adjacent values differing by 1.
*
* Constraints:
*
* 1 <= s.length <= 20
* s only consists of digits.
******************************************************************************************************/
class Solution {
private:
int pos;
public:
bool getNum(string& s, long target) {
long n = 0;
while(s[pos] == '0') pos++;
while(pos < s.size()){
n = (n*10 + s[pos++] - '0') ;
if (n == target) return true;
if (n > target ) return false; // n is already greater than target
}
return target == n;
}
long firstNum(string& s, int len) {
long n = 0;
while(s[pos] == '0') pos++;
for(; pos< s.size() && len > 0; pos++, len--) {
n = (n*10 + s[pos] - '0') ;
}
return n;
}
bool splitString(string s) {
pos = 0;
long num;
for (int len=1; len<= s.size()/2+1; len++) {
pos = 0;
num = firstNum(s, len);
if (pos >= s.size()) continue; // only have one number
bool result = true;
while( pos < s.size() ) {
if (getNum(s, --num) == false){
result = false;
break;
}
}
if (result) return true;
}
return false;
}
};