aboutsummaryrefslogtreecommitdiff
path: root/works
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-02-27 21:29:07 +0800
committercrupest <crupest@outlook.com>2021-02-27 21:29:07 +0800
commit641ead1acda087826b52f35884c19e9cf52a9971 (patch)
treead6c98e20a970935a58c65b0e56975cd49a13f9f /works
parent7da2e1fde9e6a81847753cc356d03f1c16cbe128 (diff)
downloadcrupest-641ead1acda087826b52f35884c19e9cf52a9971.tar.gz
crupest-641ead1acda087826b52f35884c19e9cf52a9971.tar.bz2
crupest-641ead1acda087826b52f35884c19e9cf52a9971.zip
import(solutions): Add leetcode 395.
Diffstat (limited to 'works')
-rw-r--r--works/solutions/leetcode/cpp/395.cpp56
1 files changed, 56 insertions, 0 deletions
diff --git a/works/solutions/leetcode/cpp/395.cpp b/works/solutions/leetcode/cpp/395.cpp
new file mode 100644
index 0000000..d45eee9
--- /dev/null
+++ b/works/solutions/leetcode/cpp/395.cpp
@@ -0,0 +1,56 @@
+#include <array>
+#include <string>
+
+using std::string;
+
+class Solution {
+public:
+ static int dfs(const std::string &s, int start, int end, int k) {
+ if (end - start < k) {
+ return 0;
+ }
+
+ std::array<int, 26> counts{0};
+
+ for (int i = start; i < end; i++) {
+ counts[s[i] - 'a']++;
+ }
+
+ int max = -1;
+
+ for (char c = 'a'; c <= 'z'; c++) {
+ int count = counts[c - 'a'];
+
+ if (count > 0 && count < k) {
+ int sub_start = start;
+
+ for (int i = start; i < end; i++) {
+ if (s[i] == c) {
+ if (sub_start != i) {
+ max = std::max(dfs(s, sub_start, i, k), max);
+ }
+ sub_start = i + 1;
+ }
+ }
+
+ if (sub_start != end) {
+ max = std::max(dfs(s, sub_start, end, k), max);
+ }
+
+ break; // This is vital.
+ }
+ }
+
+ if (max == -1)
+ return end - start;
+ else
+ return max;
+ }
+
+ int longestSubstring(string s, int k) { return dfs(s, 0, s.size(), k); }
+};
+
+int main() {
+ Solution{}.longestSubstring("aaaaaaaaaaaabcdefghijklmnopqrstuvwzyz", 3);
+ return 0;
+}