[Java]字符串的各种问题

1、求字符串中出现次数最多的子串。

此处与C++不同的是:

(1) 需要用subStrs[j].length() >= j - i 判断是否越界,在C++中可以省略。

(2)Java中判断字符串相等用equals,,C++中可以直接用 ==

 

此处借鉴前辈们在C++中的思想和实现方法

 

Description: 求一个字符串中连续出现次数最多的子串. 
基本算法描述:
    给出一个字符串abababa 
    1.穷举出所有的后缀子串
        substrs[0] = abababa;
        substrs[1] = bababa;
        substrs[2] = ababa;
        substrs[3] = baba;
        substrs[4] = aba;
        substrs[5] = ba;
        substrs[6] = a;
    2.然后进行比较
        substrs[0]比substrs[1]多了一个字母,如果说存在连续匹配的字符,那么
        substrs[0]的第1个字母要跟substrs[1]首字母匹配,同理
        substrs[0]的前2个字母要跟substrs[2]的前2个字母匹配(否则不能叫连续匹配)
        substrs[0]的前n个字母要跟substrs[n]的前n个字母匹配.
        如果匹配的并记下匹配次数.如此可以求得最长连续匹配子串.     

package strings;

public class StringMethods {
	public static void main(String args[]) {
		String sourceStr = "abababa";
		int len = sourceStr.length();
		String[] subStrs = new String[len];
		String resultStr = "";
		int maxCount = 1;
		int count;

		for (int i = 0; i < len; i++) {
			subStrs[i] = sourceStr.substring(i, len);
		}

		for (int i = 0; i < len; i++) {
			for (int j = i + 1; j < len; j++) {
				count = 1;
				if (subStrs[j].length() >= j - i
						&& subStrs[i].substring(0, j - i).equals(subStrs[j].substring(0, j - i))) {
					count++;
					for (int k = j + (j - i); k < len; k += j - i) {
						if (subStrs[k].length() >= j - i
								&& subStrs[i].subSequence(0, j - i).equals(subStrs[k].subSequence(0, j - i))) {
							count++;
						} else {
							break;
						}
					}
					if (count > maxCount) {
						maxCount = count;
						resultStr = subStrs[i].substring(0, j - i);
					}
				}
			}
		}
		System.out.println("maxCount : " + maxCount + "   resultStr : "	+ resultStr);

	}
}


 

2、求一个字符串中,最长的出现重复的字符串。

maxLen 是出现重复的字符串中最长的长度

maxLenString 是最长的重复字符串

position 是最长的重复字符串第一个出现的位置

 

关键在于:

     lr = str.indexOf(temp);
     rl = str.lastIndexOf(temp);
     if (lr != rl)

从左往右寻找 和 从右往做寻找的index不同,表示有重复出现

 

package strings;

public class FindTheLongestSame {
	public static void main(String args[]) {
		String str = "aacaaaccbbcabbbbaacccc";
		String temp = "";
		String maxLenString = "";
		int position = 0, maxLen = 0, lr, rl;
		int len = str.length();
		for (int i = 0; i <= len; i++) {
			for (int j = 0; j <= len; j++) {
				if (j > i) {
					temp = str.substring(i, j);
					lr = str.indexOf(temp);
					rl = str.lastIndexOf(temp);
					if (lr != rl) {
						int lenOfSub = temp.length();
						if (lenOfSub > maxLen) {
							maxLen = lenOfSub;
							maxLenString = temp;
							position = lr;
						}
					}
				}

			}
		}
		System.out.println(maxLenString + "   " + maxLen + "   " + position);
	}
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值