当前位置:网站首页>判断字符串是否有子字符串重复出现
判断字符串是否有子字符串重复出现
2022-08-04 05:27:00 【第一片心意】
1. 功能说明
判断一个字符串中是否有重复的子字符串出现,比如字符串
我爱足球,我爱篮球,我爱排球。
“我爱”这个子字符串出现了三次。
2. 代码实现
public class RepetitionString {
/**
* 判断字符串中是否包含重复的子串<br>
* 如果有多个子字符串重复,则返回重复次数最多的字符串<br>
* 如果多个子字符串重复次数一样,则返回最长的子字符串
*
* @param value 带判断字符串
* @param minLength 子字符串最小判断长度
* @param repetitionCount 重复次数,当重复次数达到该值,才认为原字符串包含重复字串
* @return 是否包含子串,如果包含子串,也将子串返回
*/
public String core(String value, int minLength, int repetitionCount) {
Map<String, Integer> subCount = new HashMap<>(16);
Set<String> subStrings = new HashSet<>();
for (int start = 0; start < value.length(); start++) {
handle(subCount, value.substring(start), minLength);
}
//查看子字符串重复最大次数
int maxCount = 0;
for (Map.Entry<String, Integer> entry : subCount.entrySet()) {
if (entry.getValue() > maxCount) {
maxCount = entry.getValue();
subStrings.clear();
subStrings.add(entry.getKey());
} else if (entry.getValue() == maxCount) {
subStrings.add(entry.getKey());
}
}
//根据设定重复次数返回结果
if (maxCount >= repetitionCount) {
int maxLength = 0;
String maxLengthSubString = "";
for (String subString : subStrings) {
if (subString.length() > maxLength) {
maxLength = subString.length();
maxLengthSubString = subString;
}
}
return "true:" + maxLengthSubString + "->" + maxCount;
} else {
return "false";
}
}
/**
* 遍历子串长度,处理数据
*
* @param subCount 子串及其重复数量
* @param value 待处理字符串
* @param minLength 子字符最小判断长度
*/
private void handle(Map<String, Integer> subCount, String value, int minLength) {
for (int subLength = minLength; subLength <= value.length() / 2; subLength++) {
//从起始位置取子串长度的子字符串
String substring = value.substring(0, subLength);
if (subCount.containsKey(substring)) {
continue;
}
for (int subStart = 0; subStart < value.length() - subLength + 1; subStart++) {
//从起始位置开始取子串长度的字符串和上面待判断的子字符串进行对比
String temp = value.substring(subStart, subStart + subLength);
if (Objects.equals(substring, temp)) {
if (subCount.containsKey(substring)) {
subCount.put(substring, subCount.get(substring) + 1);
} else {
subCount.put(substring, 1);
}
}
}
}
}
public static void main(String[] args) {
RepetitionString r = new RepetitionString();
String value1 = "我爱足球,我爱篮球,我爱排球。";
String value2 = "我爱足球,我喜欢打篮球";
int minLength = 2;
int repetitionCount = 2;
System.out.println(value1 + "\n\t" + r.core(value1, minLength, repetitionCount));
System.out.println(value2 + "\n\t" + r.core(value2, minLength, repetitionCount));
}
}运行结果:

边栏推荐
猜你喜欢
随机推荐
字符串常用方法
手把手教你实现buffer(二)——内存管理及移动语义
显式调用类的构造函数(而不是用赋值构造),实现一个new操作
Shell(2)数值运算与判断
webrtc中视频采集实现分析(一) 采集及图像处理接口封装
关于C#的反射,你真的运用自如嘛?
Commons Collections1
浏览器中的同源策略
Unity开发类似Profile那样的数据分析工具
FFmpeg源码分析:avformat_open_input
网络大作业心得笔记
个人练习三剑客基础之模仿CSDN首页
PHP解决字符乱码问题(多种编码转换)
对象存储-分布式文件系统-MinIO-1:概念
phpexcel导出数据为xml
webrtc中的引用计框架
win云服务器搭建个人博客失败记录(wordpress,wamp)
关系型数据库-MySQL:多实例配置
进程、线程、协程的区别和联系?
Sublime Text 3 2021.8.3 个人配置









