forked from haoel/leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
New Problem Solution - "1849. Splitting a String Into Descending Cons…
…ecutive Values"
- Loading branch information
Showing
2 changed files
with
101 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
100 changes: 100 additions & 0 deletions
100
...StringIntoDescendingConsecutiveValues/SplittingAStringIntoDescendingConsecutiveValues.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,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; | ||
} | ||
}; |