本帖最后由 许兵兵 于 2013-4-7 20:35 编辑
- /*
- *
- 获取两个字符串的最大相同子串。
- "sdfsabcdedgdfgwkketrfw"
- "rabcdew"
- */
- public class Test {
- public static void main(String[] args) {
- String s1 = "sdfsabcdedgdfgwkketrfw";// 22
- String s2 = "rabcdew";// 7
- String s3 = getCut(s2, s1);
- System.out.println(s3);
- }
- /**
- * @param str
- * @param str1
- * @return
- * 思路:1.选出最大长度的字符串,因此我认为应该是从最长开始截取,然后判断是不是在另外一个字符串中,
- * 如果截取的长度在另外一个字符串中的话,就直接不用再判断了;否则如果从最小开始截取的话,
- * 那么有可能截取的很短的字符串,也在长的字符串中,那么再往下,再判断多少次无法控制,
- * 无法确定现在截取的是否是最长,只能确定现在截取的字符串在另外一个字符串中.
- * 2.既然要从最长开始截取的话,那么我们肯定是先保证一个长度,然后再取出所有此长度的字符串,
- * 因此外循环我们是确定长度的.
- * 3.那么内循环,我们就用来截取外循环确定长度的字符串然后比较.
- * 4.既然长度i固定,那么截取的时候就从一端开始一个挨着一个截取,
- * 然后比较str1.substring(a, b)
- * 从尾部开始:
- * b = str1.length() - 1
- * a = b- i 那么长度就是固定的I
- * 截取的下一段就是substring(a--, b--)
- * 如果b<0那么结束本次循环
- * 从前段开始:
- * a =0
- * b =i
- * 截取的下一段就是substring(a,b)
- * 如果b>str1.length() - 1 结束本次循环
- * 5.因为我们是从截取最长的字符串开始判断,因此如果出现截取的字符串出现的另外一个字符串中,
- * 那么我们就直接跳出所有循环(其他的已经没有必要再判断了).
- * 6.如果判断了所有的,最后发现截取的所有都不在另外一个字符串中,那么我们就需要输出,null
- */
- private static String getCut(String str, String str1) {
- String temp = null;
- A:for (int i = str1.length()-1; i > 0; i--) {
- B:for (int b = str1.length() - 1, a = b- i; a >= 0; a--,b--) {
- if (str.contains(str1.substring(a, b))) {
- temp=str1.substring(a, b);
- break A;
- }
- }
- }
- if (null==temp) {
- System.out.println("他们没有相同的字符串");
- }
- return temp;
- }
- }
复制代码 这是我对这个题目的思路,感觉应该对着. 这里我跳出循环用的是break 还有那种方法能跳出循环A,我知道return ,可是不怎么会用.谁给我讲讲!
|