我一直在和朋友一起练习面试问题,然后他把这个问题扔给了我:
给定一个告诉您字符串是否有效的方法,编写一个接受字符串的方法,并返回最长的有效子字符串(不重新排序字符)。
我的第一个暴力解决方案是找到输入字符串的所有子集,然后将它们插入(最长到最短)给定方法,直到找到有效字符串并返回该字符串。
但这显然不够好。
所以我试着这样想:
检查输入字符串
使用inputString
== length
inputString length - 1
的所有子集
等等,直到检查了所有长度为1的子集,然后返回false
我脑海中的问题是,为了使其最佳,我们希望利用我们只关心最长有效字符串的事实。如果我以递归方式检查每个子集,那么当我真正寻找广度优先时,我会对子集进行深度优先遍历。 ,所以我能找到最快的。
一旦我意识到这一点,我就陷入了困境。我甚至无法提出伪代码来解决这个问题。
是"广度优先"甚至可以搜索字符串的子集?
我能找到的最接近的解决方案是在数学堆栈交换中,有人发布了一个看起来很有希望的答案 - https://math.stackexchange.com/questions/89419/algorithm-wanted-enumerate-all-subsets-of-a-set-in-order-of-increasing-sums
但不幸的是,我很难理解。
最好的解决方案是通过所有子集进行深度优先递归迭代并从那里返回最长的有效字符串吗?
答案 0 :(得分:1)
string in
for int sub_len in len(in) , 1 //length of the substring must be smaller than/equal to
//the length of the input and atleast 1
for int sub_offset in 0 , len(in) - sub_len
//the offset of the string must be in [0 , n]
//where n is the number of characters that are not in the
//substring
string sub = substring(in , sub_offset , sub_len)
if isValid(sub)
return sub
这将为给定输入(in
)生成所有可能的子字符串,并返回第一个/最长的有效子字符串。