給定乙個字串陣列 arr,字串 s 是將 arr 某一子串行字串連線所得的字串,如果 s 中的每乙個字元都只出現過一次,那麼它就是乙個可行解。剛看到這道題目的時候,我使用了與**礦工同樣的回溯演算法設計解決方案:請返回所有可行解 s 中最長長度。-
======================================
示例 1:
輸入:arr = [「un」,「iq」,「ue」]
輸出:4
解釋:所有可能的串聯組合是 「」,「un」,「iq」,「ue」,「uniq」 和 「ique」,最大長度為 4。
=====================================
假設當前字串被選中,如果當前字串中的字元與路徑上其他字串的字元相同,則該字串不是可行解,返回0,如果該字串可行,則標記該字串,並對剩餘所有字串進行搜尋,返回最長的拼接字串長度.在遞迴退出時,取消對當前字串的標記.
我們可以使用將字串加入集合與移除集合的方式完成字串的標記與取消標記.同時,為了檢查已有字串是否為可行解,我們需要在標記字串的同時,記錄該字串中的字元個數.我們可以使用整數陣列紀錄.
該方法在測試題目給出的集合案例時,通過了,但當字串較大時,則失敗.
當我進一步分析該問題後,發現我這樣設計的回溯演算法其實是對陣列中的所有字串進行了全排列,對每一排列, 從前向後新增字元,保證每次新增的字串中字元與已有字元不重複,新增的字元總數即為該排列所有的最長拼接字串.然後返回最長的拼接字串.仔細分析會發現,字串的次序在最優解中並無任何作用.而排列則考慮了字串的次序,全排列的時間複雜度為o(n!).這是非常大的時間複雜度!由於我們並不關心字串的次序,因此我們真正需要的是組合而非排列.
對於組合問題,每一字串要麼出現在最優解中,要麼不出現在最優解中.因此其時間複雜度為o(2
n)
o(2^n)
o(2n
),這要遠低於o(n
!)
o(n!)
o(n!).
我們可以順序遍歷每一字串,如果當前字串可以加入(不與已有字元重合),則我們可以分別計算當前字串被加入與不被加入的拼接字串長度,並返回最大值.如果當前字串不能被加入,則我們直接返回其不被加入的拼接字串長度.
排列方法:
class
solution
boolean unique =
true
;for
(int n: chars)
}for
(int i =
0; i < s.
length()
; i++
)return unique;
}private
void
addstringtocharset
(string s)
}private
void
removestringfromcharset
(string s)
}private
intdfs
(list
arr, string s)
}//退出取消標記
strs.
remove
(s);
removestringfromcharset
(s);
return length + s.
length()
;}public
intmaxlength
(list
arr)
}
組合方法:class
solution
boolean unique =
true
;for
(int n: chars)
}for
(int i =
0; i < s.
length()
; i++
)return unique;
}private
void
addstringtocharset
(string s)
}private
void
removestringfromcharset
(string s)
}private
intdfs
(list
arr,
int i)
//計算不加入當前字串時的最大長度
maxlength = math.
max(maxlength,
dfs(arr, i+1)
);return maxlength;
}public
intmaxlength
(list
arr)
}
leetcode 30 串聯所有單詞的字串
difficulty 困難 給定乙個字串 s 和一些長度相同的單詞 words。找出s中恰好可以由words中所有單詞串聯形成的子串的起始位置。注意子串要與words中的單詞完全匹配,中間不能有其他字元,但不需要考慮 words 中單詞串聯的順序。示例 1 輸入 s barfoothefoobarm...
leetcode30 串聯所有單詞的字串
class solution if lreturn answer for int start 0 start int num ns n s.size if num ns w break for int i 0 i new m.empty answer.push back start for int ...
LeetCode 30 串聯所有單詞的字串
給定乙個字串s和一些長度相同的單詞words。找出s中恰好可以由words中所有單詞串聯形成的子串的起始位置 注意子串要與words中的單詞完全匹配,中間不能有其他字元,但不需要考慮words中單詞串聯的順序。注意 單詞的長度相同 輸入 s barfoothefoobarman words foo ...