当前位置:网站首页>判断字符串是否有子字符串重复出现
判断字符串是否有子字符串重复出现
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 Visual Effect Graph入门与实践
FLV格式详解
BUUCTF——MISC(一)
Programming hodgepodge (3)
7.16 Day22---MYSQL (Dao mode encapsulates JDBC)
解决安装nbextensions后使用Jupyter Notebook时出现template_paths相关错误的问题
FFmpeg源码分析:avformat_open_input
基于C语言的学生信息管理系统_(更新版)_(附源码和安装包)_课程设计_**往事随風**的博客
自动化运维工具Ansible(3)PlayBook
ORACLE LINUX 6.5 安装重启后Kernel panic - not syncing : Fatal exception
随机推荐
对象存储-分布式文件系统-MinIO-1:概念
音视频相关基础知识与FFmpeg介绍
Shell(2)数值运算与判断
C language -- operator details
智能合约安全——溢出漏洞
自动化运维工具Ansible(5)流程控制
Unity Visual Effect Graph入门与实践
原型对象及原型链的理解
对象存储-分布式文件系统-MinIO-3:MinIo Client(mc)
进入古诗文网站个人中心,绕过登录
PHP课堂笔记(一)
关于 for in与for of 的差别以及如何使用
Code Refactoring: For Unit Testing
纳米级完全删除MYSQL5.7以及一些吐槽
二月、三月校招面试复盘总结(一)
自动化运维工具Ansible(3)PlayBook
Deploy LVS-DR cluster [experimental]
智能合约安全——delegatecall (1)
keep-alive的使用及详解
页面刷新没有执行watch?