小问题 求助:String s="abcdecd";比较字符,如果有相同的则打印;eg: 有两个相同的cd则打印 2 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 for exampleString s="abcdecd"; Map<String, Integer> map = new HashMap<String, Integer>();for (int i=1; i<=s.length()/2; i++) { for (int j=0; j<s.length-i; j++) { String regex = s.substring(j, i); Pattern p = Pattern.compile(regex); Matcher m = p.match(s); int count = 0; while (m.find()) { count++; } map.put(regex, count); }}for (Map.Entry<String, Integer> entry : map.entrySet()) { System.out.printf("相同字符串[%s]有[%d]个\n", entry.getKey(), entry.getValue());} 也可以不用正则表达式String s="abcdecd"; Map<String, Integer> map = new HashMap<String, Integer>();for (int i=1; i<=s.length()/2; i++) { for (int j=0; j<s.length-i; j++) { String regex = s.substring(j, i); int count = (s.length()-s.replaceAll(regex).length())/regex.length(); map.put(regex, count); }}for (Map.Entry<String, Integer> entry : map.entrySet()) { System.out.printf("相同字符串[%s]有[%d]个\n", entry.getKey(), entry.getValue());} zheng ze biao da shi ke shi ge hao dong xi ni ke yi qu wen wen ni men lao shi 借用了二楼和三楼的思路,但 qybao 将字符串的长度除以2:s.length()/2这会带来问题,因为有可能后半个出现一个模式,前半个没有,但后半个出现多个,这种情况你的算法算不出来,比如:aaaaaaaaaabcbcimport java.io.IOException;import java.util.HashSet;import java.util.Set;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * * 双重循环,然后用正则表达式匹配每一个字串。 * 使用set来进行排重。 * * 涉及到算法我很弱,仅供参考。 * @author jinxfei * */public class Test { public static void main(String[] args) throws IOException { Set exist=new HashSet(); String str="abcdecdafdfdacdafdafadscd"; int len=str.length(); for (int i=0; i<len; i++) { for (int j=1; j<(len-i); j++) { String regex = str.substring(i, i+j); if (exist.contains(regex)){ //已经计算过的不算 continue; } Pattern p = Pattern.compile(regex); Matcher m = p.matcher(str); int count = 0; while (m.find()) { count++; } if (count>1){ System.out.println("子串:\t"+regex+"\t共出现 "+count+" 次。"); exist.add(regex); } } } }} int count = (s.length()-s.replaceAll(regex).length())/regex.length();这句是什么意思? 参考二、三楼朋友,做了修改 String string = str; Map<String,Integer> map = new TreeMap<String,Integer>(); for(int i=0;i<string.length();i++) for(int j=i+1;j<=string.length();j++){ String regex = string.substring(i,j); Matcher m = Pattern.compile(regex).matcher(string); int count=0; while(m.find()){ count++; } map.put(regex, count); } for(Map.Entry<String,Integer> s : map.entrySet()) System.out.printf("相同字符串[%s]有[%d]个\n",s.getKey(),s.getValue()); 当时随手写的,确实疏忽了,至于Set排出重复,数据小的时候完全没必要,因为Map会覆盖掉重复的这里也漏了一点int count = (s.length()-s.replaceAll(regex, "").length())/regex.length();子串出现的次数=(字符串长度-把所有子串都去掉后的字符串的长度)/子串的长度 求一个java写的聊天程序,命令行的就行。 急求lookandfeel,小弟在此跪谢啦! 关于StringTokenizer 和 split 的问题 刚刚开始学JAVA,请教一个关于输入判断和程序时间的问题 SimpleDateFormat的使用中的 问题 在xp系统中java连sqlserver的补丁包 全国计算机等级考试四级与Linux的RCE认证工程师哪个更好? TextField问题~~~急~!在线等!!帮帮忙 想学servlet,不知道要下什么工具,谁来拿分? what's inside Xerces? 合并排序问题? Hibernate中many-to-many的问题
Map<String, Integer> map = new HashMap<String, Integer>();
for (int i=1; i<=s.length()/2; i++) {
for (int j=0; j<s.length-i; j++) {
String regex = s.substring(j, i);
Pattern p = Pattern.compile(regex);
Matcher m = p.match(s);
int count = 0;
while (m.find()) {
count++;
}
map.put(regex, count);
}
}for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.printf("相同字符串[%s]有[%d]个\n", entry.getKey(), entry.getValue());
}
Map<String, Integer> map = new HashMap<String, Integer>();
for (int i=1; i<=s.length()/2; i++) {
for (int j=0; j<s.length-i; j++) {
String regex = s.substring(j, i);
int count = (s.length()-s.replaceAll(regex).length())/regex.length();
map.put(regex, count);
}
}for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.printf("相同字符串[%s]有[%d]个\n", entry.getKey(), entry.getValue());
}
ni ke yi qu wen wen ni men lao shi
但 qybao 将字符串的长度除以2:s.length()/2
这会带来问题,因为有可能后半个出现一个模式,前半个没有,但后半个出现多个,这种情况你的算法算不出来,比如:
aaaaaaaaaabcbcimport java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/**
*
* 双重循环,然后用正则表达式匹配每一个字串。
* 使用set来进行排重。
*
* 涉及到算法我很弱,仅供参考。
* @author jinxfei
*
*/
public class Test {
public static void main(String[] args) throws IOException {
Set exist=new HashSet();
String str="abcdecdafdfdacdafdafadscd";
int len=str.length();
for (int i=0; i<len; i++) {
for (int j=1; j<(len-i); j++) {
String regex = str.substring(i, i+j);
if (exist.contains(regex)){
//已经计算过的不算
continue;
}
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
int count = 0;
while (m.find()) {
count++;
}
if (count>1){
System.out.println("子串:\t"+regex+"\t共出现 "+count+" 次。");
exist.add(regex);
}
}
} }
}
这句是什么意思?
String string = str;
Map<String,Integer> map = new TreeMap<String,Integer>();
for(int i=0;i<string.length();i++)
for(int j=i+1;j<=string.length();j++){
String regex = string.substring(i,j);
Matcher m = Pattern.compile(regex).matcher(string);
int count=0;
while(m.find()){
count++;
}
map.put(regex, count);
}
for(Map.Entry<String,Integer> s : map.entrySet())
System.out.printf("相同字符串[%s]有[%d]个\n",s.getKey(),s.getValue());
至于Set排出重复,数据小的时候完全没必要,因为Map会覆盖掉重复的这里也漏了一点
int count = (s.length()-s.replaceAll(regex, "").length())/regex.length();
子串出现的次数=(字符串长度-把所有子串都去掉后的字符串的长度)/子串的长度