【发布时间】:2021-06-02 07:00:11
【问题描述】:
我正在尝试解决 LeetCode 上的this question:
如果
s包含的每个字母表都以大写和小写形式出现,则字符串s很好。例如,“abABB”很好,因为出现了“A”和“a”,出现了“B”和“b”。但是,“abA”并不是因为出现了“b”,而是“B”没有出现。
给定一个字符串s,返回s的最长子字符串,这很好。如果有多个,则返回最早出现的子字符串。如果没有,则返回一个空字符串。
对于 s = "YazaAay",预期输出为:"aAa"
其中一个top voted solutions 使用分而治之的方法:
class Solution {
public String longestNiceSubstring(String s) {
if (s.length() < 2) return "";
char[] arr = s.toCharArray();
Set<Character> set = new HashSet<>();
for (char c: arr) set.add(c);
for (int i = 0; i < arr.length; i++) {
char c = arr[i];
if (set.contains(Character.toUpperCase(c)) && set.contains(Character.toLowerCase(c))) continue;
String sub1 = longestNiceSubstring(s.substring(0, i));
String sub2 = longestNiceSubstring(s.substring(i+1));
return sub1.length() >= sub2.length() ? sub1 : sub2;
}
return s;
}
}
我了解它的工作原理,但不了解使用分而治之方法背后的直觉。换句话说,如果我在忘记一切之后的几天/几周后再重新审视这个问题,我将无法意识到这是一个分而治之的问题。
是什么“东西”使它可以通过分而治之的方法解决?
【问题讨论】:
-
总的来说,分而治之非常适合复杂的场景,因为您可以轻松地在多个线程上运行代码。 (顺便说一句:这个代码示例中的递归方法调用看起来很邪恶,我认为如果输入太大,这可能会导致 StackOverflowError)
-
@BenjaminM,是的,在这种情况下,问题约束表明限制不是太高:
1 <= s.length <= 100。
标签: java algorithm divide-and-conquer