插: 前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到網(wǎng)站。
堅(jiān)持不懈,越努力越幸運(yùn),大家一起學(xué)習(xí)鴨~~~
題目:
給你一個(gè)字符串 s ,請(qǐng)你拆分該字符串,并返回拆分后唯一子字符串的最大數(shù)目。
字符串 s 拆分后可以得到若干 非空子字符串 ,這些子字符串連接后應(yīng)當(dāng)能夠還原為原字符串。但是拆分出來的每個(gè)子字符串都必須是 唯一的 。
注意:子字符串 是字符串中的一個(gè)連續(xù)字符序列。
示例 1:
輸入:s = "ababccc"
輸出:5
解釋:一種最大拆分方法為 ['a', 'b', 'ab', 'c', 'cc'] 。像 ['a', 'b', 'a', 'b', 'c', 'cc'] 這樣拆分不滿足題目要求,因?yàn)槠渲械?'a' 和 'b' 都出現(xiàn)了不止一次。
示例 2:
輸入:s = "aba"
輸出:2
解釋:一種最大拆分方法為 ['a', 'ba'] 。
示例 3:
輸入:s = "aa"
輸出:1
解釋:無法進(jìn)一步拆分字符串。
提示:
1 <= s.length <= 16
java代碼:
class Solution {
int maxSplit = 1;
public int maxUniqueSplit(String s) {
Set<String> set = new HashSet<String>();
backtrack(0, 0, s, set);
return maxSplit;
}
public void backtrack(int index, int split, String s, Set<String> set) {
int length = s.length();
if (index >= length) {
maxSplit = Math.max(maxSplit, split);
} else {
for (int i = index; i < length; i++) {
String substr = s.substring(index, i + 1);
if (set.add(substr)) {
backtrack(i + 1, split + 1, s, set);
set.remove(substr);
}
}
}
}
}