【发布时间】:2023-03-29 02:57:01
【问题描述】:
这个特别的面试问题难倒我:
Given two Strings S1 and S2. Find the longest Substring which is a Prefix of S1 and suffix of S2。
通过谷歌,我遇到了以下解决方案,但不太明白它在做什么。
public String findLongestSubstring(String s1, String s2) {
List<Integer> occurs = new ArrayList<>();
for (int i = 0; i < s1.length(); i++) {
if (s1.charAt(i) == s2.charAt(s2.length()-1)) {
occurs.add(i);
}
}
Collections.reverse(occurs);
for(int index : occurs) {
boolean equals = true;
for(int i = index; i >= 0; i--) {
if (s1.charAt(index-i) != s2.charAt(s2.length() - i - 1)) {
equals = false;
break;
}
}
if(equals) {
return s1.substring(0,index+1);
}
}
return null;
}
我的问题:
- 此解决方案如何工作?
- 您是如何发现这个解决方案的?
- 有更直观/更简单的解决方案吗?
【问题讨论】:
-
做电脑。你有一个你理解的问题,以及一个回答它的程序,但你不理解。所以要做的就是在纸上画一个例子,一步一步地运行。一段时间后,您要么会理解算法在做什么,要么会想到更好的算法。但它绝对必须在实践中完成,有一个具体的例子,并且可能以书面形式进行 - 在你的头脑中进行这种分析更难,并且需要更多的算法经验。
-
@KilianFoth 我已经试过了。对不起,我没有在问题中提到这一点。我面临的问题是,虽然解决方案有效,但我无法直观地理解它为什么有效,以及人们是如何得出这个解决方案的。因此,我一直在寻找一个直观的解释,说明如何获得这个解决方案,或者我更容易理解的其他解决方案。
-
我用 3 行 java 代码 here 实现了一个解决方案。正如@Kilian 所写,您应该首先尝试自己找到解决方案,因为您将从中获得更多收益。即使您可能犯的错误将来也会有用。 ;) 您发布的代码实现了我在代码中省略的一些优化。
-
查看我的答案以获得更深入的描述和对您发布的代码的解释。