当前位置:网站首页>判断字符串是否有子字符串重复出现
判断字符串是否有子字符串重复出现
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));
}
}运行结果:

边栏推荐
- Unity行为树AI分享
- 多个gcc/glibc版本的共存及指定gcc版本的编译
- Commons Collections1
- Can 't connect to MySQL server on' localhost3306 '(10061) simple solutions
- keep-alive的使用及详解
- 智能合约安全——私有数据访问
- 对象存储-分布式文件系统-MinIO-3:MinIo Client(mc)
- 显式调用类的构造函数(而不是用赋值构造),实现一个new操作
- ORACLE LINUX 6.5 安装重启后Kernel panic - not syncing : Fatal exception
- 自动化运维工具Ansible(5)流程控制
猜你喜欢
随机推荐
Embedded system driver primary [4] - under the basis of character device driver _ concurrency control
OpenGLES 学习之帧缓存
计算属性的作用及使用?
关系型数据库-MySQL:约束管理、索引管理、键管理语句
将两个DataTable合并——DataTable.Merge 方法
箭头函数的使用
ORACLE LINUX 6.5 安装重启后Kernel panic - not syncing : Fatal exception
warning C4251: “std::vector&lt;_Ty&gt;”需要有 dll 接口由 class“Test”的客户端使用错误
webrtc中视频采集实现分析(二) 视频帧的分发
phpexcel导出数据为xml
TensorRT例程解读之语义分割demo
关于 for in与for of 的差别以及如何使用
自动化运维工具Ansible(1)基础
7.15 Day21---MySQL----Index
Unity DOTS学习教程汇总
实际开发中左菜单自定义图标点击切换
解决JDBC在web工程中无法获取配置文件
7.18 Day23 - the markup language
php将多维数据保存进json文件
记录获取参赛选手信息过程









