找出字符串中最长的一段没有重复字符的子串
来源:互联网 发布:51单片机书籍推荐 编辑:程序博客网 时间:2024/04/23 18:48
/**
* 需求说明:
* 找出下面的字符串中最长的一段没有重复字符的子串。如:Hel就是一个没有重复字符的字串。
* Hello World! My code, my love, my precious!
*
* 该类使用最基本的算法实现全字符扫描实现最长没有重复字符的子串检索功能
*
* 存在问题说明:
* 1、算法是基本实现,而且存在重复判断,有待改善。
* 2、没用日志工具,直接使用标准输出流
*
* @author admin
*
*
*/
public class StringUtils {
private boolean isPrint = true; //是否打印计算过程
private String flag = "#"; //空位符号
/**
* 程序启动入口
*
* @param args
*/
public static void main(String[] args)
{
StringUtils test = new StringUtils ();
//String str = "Hello World! My code, my love, my precious!"; //任意用例测试
//String str = "abcdef123456"; //原本字符串就不重复
//String str = "5555555555555abc55555555555"; //两组(中间)
//String str = "abc555555555555555555555555abc"; //两组(开头、末尾)
//String str = "5555abc55555555abc555555555555"; //四组
String str = "5555abc55555555edf555555555555"; //四组
//String str = "abc555555555555555555555555edf"; //两组
//String str = "刘祖武00000000000刘祖武0000"; //中文
test.start(str);
}
/**
* 主程序入口
*
* @param str<传入方法>
*/
public void start(String str)
{
long startTime = System.currentTimeMillis();
if (str == null || "".equals(str)) {
System.err.println("输入的参数不能为空! " );
return;
}
if (this.isRepeat(str)) {
List<String> maxUniqueStrList = maxUniqueSubstring(str);
print(str,maxUniqueStrList);
} else {
System.out.println(str + " 最长无重复字符串是: " + str + " 长度: " + str.length());
}
long endTime = System.currentTimeMillis();
System.out.println("共计耗时 :" + (endTime - startTime) + " 毫秒");
}
/**
* 判断字符串是否有重复,返回真、假
*
* @param tmp
* @return
*/
public boolean isRepeat(String tmp)
{
boolean isOk = false;
char [] tmpchar = tmp.toCharArray();
for (int i = 0; i < tmpchar.length; i++) {
for (int j = i+1; j < tmpchar.length; j++) {
if(tmpchar[i] == tmpchar[j]){
isOk = true;
break;
}
}
}
return isOk;
}
/**
*
* @param str 最大无重复字符串
* @return
*/
public List<String> maxUniqueSubstring (String str)
{
int maxUniqueLength = 0;
List<String> maxUniqueStrList = new ArrayList<String>();
int startIndexOuter = 0;
int endIndexOuter = str.length();
int endIndexInner = 0;
int lengthTmpOuter = 0;
int lengthTmpInner = 0;
int count = 0; //一共判断多少次字符串是否重复
String maxUniqueStringTmpOuter = "";
String maxUniqueStringTmpInner = "";
//外层循环
for (;startIndexOuter <= endIndexOuter; startIndexOuter ++) {
maxUniqueStringTmpOuter = str.substring(startIndexOuter, endIndexOuter);
lengthTmpOuter = maxUniqueStringTmpOuter.length();
//外层循环打印start
if (isPrint) {
printFlag(endIndexOuter - lengthTmpOuter);
System.out.println(maxUniqueStringTmpOuter );
}
//外层循环打印end
if (this.isRepeat(maxUniqueStringTmpOuter)) {
count ++;
//内层循环
endIndexInner = maxUniqueStringTmpOuter.length();
for (;endIndexInner >= 0; endIndexInner --) {
maxUniqueStringTmpInner = maxUniqueStringTmpOuter.substring(0, endIndexInner);
lengthTmpInner = maxUniqueStringTmpInner.length();
//内层循环打印start
if (isPrint) {
printFlag(startIndexOuter);
System.out.println(maxUniqueStringTmpInner );
}
//内层循环打印end
if (!this.isRepeat(maxUniqueStringTmpInner)) {
count ++;
if (lengthTmpInner > maxUniqueLength) {
maxUniqueStrList.clear();
maxUniqueLength = lengthTmpInner;
maxUniqueStrList.add(maxUniqueStringTmpInner);
} else if (lengthTmpInner == maxUniqueLength) {
maxUniqueStrList.add(maxUniqueStringTmpInner);
}
}
}
} else {
if (lengthTmpOuter > maxUniqueLength) {
maxUniqueStrList.clear();
maxUniqueLength = lengthTmpOuter;
maxUniqueStrList.add(maxUniqueStringTmpOuter);
} else if (lengthTmpOuter == maxUniqueLength) {
maxUniqueStrList.add(maxUniqueStringTmpOuter);
}
}
}
System.out.println("\n\n共计判断是否重复: " + count + "次");
return maxUniqueStrList;
}
private void print(String source,List<String> maxUniqueStrList)
{
if (maxUniqueStrList == null || maxUniqueStrList.size() == 0) {
System.err.println("无效最大无重复字符串数组,请检查代码。");
return;
}
String maxStr = "";
System.out.println("\n------执行结果------\n字符串源: " + source + " 字符串长度:" + source.length() + " 共计查找到【" + maxUniqueStrList.size() + "】组最长,分别是:");
for(int i = 0, n = maxUniqueStrList.size(); i < n; i++) {
maxStr = maxUniqueStrList.get(i);
System.out.println("第"+(i + 1)+"组最长无重复字符串是: " + maxStr + " 长度: " + maxStr.length());
}
System.out.println("------执行结果------");
}
private void printFlag(int num)
{
while(num > 0) {
System.out.print(flag);
num --;
}
}
}
* 需求说明:
* 找出下面的字符串中最长的一段没有重复字符的子串。如:Hel就是一个没有重复字符的字串。
* Hello World! My code, my love, my precious!
*
* 该类使用最基本的算法实现全字符扫描实现最长没有重复字符的子串检索功能
*
* 存在问题说明:
* 1、算法是基本实现,而且存在重复判断,有待改善。
* 2、没用日志工具,直接使用标准输出流
*
* @author admin
*
*
*/
public class StringUtils {
private boolean isPrint = true; //是否打印计算过程
private String flag = "#"; //空位符号
/**
* 程序启动入口
*
* @param args
*/
public static void main(String[] args)
{
StringUtils test = new StringUtils ();
//String str = "Hello World! My code, my love, my precious!"; //任意用例测试
//String str = "abcdef123456"; //原本字符串就不重复
//String str = "5555555555555abc55555555555"; //两组(中间)
//String str = "abc555555555555555555555555abc"; //两组(开头、末尾)
//String str = "5555abc55555555abc555555555555"; //四组
String str = "5555abc55555555edf555555555555"; //四组
//String str = "abc555555555555555555555555edf"; //两组
//String str = "刘祖武00000000000刘祖武0000"; //中文
test.start(str);
}
/**
* 主程序入口
*
* @param str<传入方法>
*/
public void start(String str)
{
long startTime = System.currentTimeMillis();
if (str == null || "".equals(str)) {
System.err.println("输入的参数不能为空! " );
return;
}
if (this.isRepeat(str)) {
List<String> maxUniqueStrList = maxUniqueSubstring(str);
print(str,maxUniqueStrList);
} else {
System.out.println(str + " 最长无重复字符串是: " + str + " 长度: " + str.length());
}
long endTime = System.currentTimeMillis();
System.out.println("共计耗时 :" + (endTime - startTime) + " 毫秒");
}
/**
* 判断字符串是否有重复,返回真、假
*
* @param tmp
* @return
*/
public boolean isRepeat(String tmp)
{
boolean isOk = false;
char [] tmpchar = tmp.toCharArray();
for (int i = 0; i < tmpchar.length; i++) {
for (int j = i+1; j < tmpchar.length; j++) {
if(tmpchar[i] == tmpchar[j]){
isOk = true;
break;
}
}
}
return isOk;
}
/**
*
* @param str 最大无重复字符串
* @return
*/
public List<String> maxUniqueSubstring (String str)
{
int maxUniqueLength = 0;
List<String> maxUniqueStrList = new ArrayList<String>();
int startIndexOuter = 0;
int endIndexOuter = str.length();
int endIndexInner = 0;
int lengthTmpOuter = 0;
int lengthTmpInner = 0;
int count = 0; //一共判断多少次字符串是否重复
String maxUniqueStringTmpOuter = "";
String maxUniqueStringTmpInner = "";
//外层循环
for (;startIndexOuter <= endIndexOuter; startIndexOuter ++) {
maxUniqueStringTmpOuter = str.substring(startIndexOuter, endIndexOuter);
lengthTmpOuter = maxUniqueStringTmpOuter.length();
//外层循环打印start
if (isPrint) {
printFlag(endIndexOuter - lengthTmpOuter);
System.out.println(maxUniqueStringTmpOuter );
}
//外层循环打印end
if (this.isRepeat(maxUniqueStringTmpOuter)) {
count ++;
//内层循环
endIndexInner = maxUniqueStringTmpOuter.length();
for (;endIndexInner >= 0; endIndexInner --) {
maxUniqueStringTmpInner = maxUniqueStringTmpOuter.substring(0, endIndexInner);
lengthTmpInner = maxUniqueStringTmpInner.length();
//内层循环打印start
if (isPrint) {
printFlag(startIndexOuter);
System.out.println(maxUniqueStringTmpInner );
}
//内层循环打印end
if (!this.isRepeat(maxUniqueStringTmpInner)) {
count ++;
if (lengthTmpInner > maxUniqueLength) {
maxUniqueStrList.clear();
maxUniqueLength = lengthTmpInner;
maxUniqueStrList.add(maxUniqueStringTmpInner);
} else if (lengthTmpInner == maxUniqueLength) {
maxUniqueStrList.add(maxUniqueStringTmpInner);
}
}
}
} else {
if (lengthTmpOuter > maxUniqueLength) {
maxUniqueStrList.clear();
maxUniqueLength = lengthTmpOuter;
maxUniqueStrList.add(maxUniqueStringTmpOuter);
} else if (lengthTmpOuter == maxUniqueLength) {
maxUniqueStrList.add(maxUniqueStringTmpOuter);
}
}
}
System.out.println("\n\n共计判断是否重复: " + count + "次");
return maxUniqueStrList;
}
private void print(String source,List<String> maxUniqueStrList)
{
if (maxUniqueStrList == null || maxUniqueStrList.size() == 0) {
System.err.println("无效最大无重复字符串数组,请检查代码。");
return;
}
String maxStr = "";
System.out.println("\n------执行结果------\n字符串源: " + source + " 字符串长度:" + source.length() + " 共计查找到【" + maxUniqueStrList.size() + "】组最长,分别是:");
for(int i = 0, n = maxUniqueStrList.size(); i < n; i++) {
maxStr = maxUniqueStrList.get(i);
System.out.println("第"+(i + 1)+"组最长无重复字符串是: " + maxStr + " 长度: " + maxStr.length());
}
System.out.println("------执行结果------");
}
private void printFlag(int num)
{
while(num > 0) {
System.out.print(flag);
num --;
}
}
}
- 找出字符串中最长的一段没有重复字符的子串
- 找出一个字符串中出现的重复的最长的字符子串
- 找出一个字符串中不含重复字符的最长子字符串
- 给定一个字符串,返回字符串中没有重复字符的最长子串的长度
- 从字符串中找出一个最长的不含重复字符的子字符串
- 【LeetCode题目记录-3】字符串中最长的没有重复字符的子串
- 没有重复字符的最长子串
- 从字符串中截取最长的没有重复字符的子字符串(一次循环)
- 求字符串中最长无重复字符的子串
- 求字符串中最长无重复字符的子串
- 求字符串中不重复字符的最长子串
- 查找字符串中最长无重复字符的子串
- 查找字符串中最长重复字符的子串
- 求字符串中最长无重复字符的子串
- 求字符串中最长无重复字符的子串
- 求字符串中最长无重复字符的子串
- 字符串中最长无重复字符的子串
- 求字符串中最长无重复字符的子串
- C# 应用程序设置
- 几种常用排序方法汇总
- 一些话30岁以后知道就晚了
- myeclipse 中文乱码问题
- Linux常用性能调优工具索引
- 找出字符串中最长的一段没有重复字符的子串
- 人生认知
- ksoap2与axis2交互的问题
- Swinghacks——抗锯齿字体2
- 各种数据格式转换简单实现
- Required amount of space(22099.23MB) is not available.
- 婚姻
- apk反编译(仅供学习)
- matlab画图最大化以及录制GIF动画