找出字符串中最长的一段没有重复字符的子串

来源:互联网 发布: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 --;
}
}
}
原创粉丝点击