101 lines
3.2 KiB
C++
101 lines
3.2 KiB
C++
// 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;
|
||
}
|
||
};
|