找出字符串最长不重复子串,输出长度
来源:互联网 发布:软件项目估计方法 编辑:程序博客网 时间:2024/05/22 08:25
找出字符串的最长不重复子串,输出长度和子串
方法一:穷举法,空间复杂度是O(1),时间复杂度是O(N^4)
java代码实现
<pre name="code" class="java">public class Max_substring {public int max_unique_substring(char[] str){int maxlen = 0;int begin = 0;int n = str.length;for(int i = 0; i < n; ++i){for(int j = i+1; j < n; ++j){int flag = 0;//判断子串是否有重复字符for(int m = i; m < j; ++m){for(int k = m+1; k < j; ++k){if(str[m] == str[k]){flag = 1;break;}}if(1 == flag) break;}if(0 == flag && j-i+1 > maxlen){maxlen = j-i+1;begin = i;}}}StringBuffer s = new StringBuffer();for(int g = 0; g < n; ++g){s.append(str[g]);}System.out.println(s.toString().substring(begin,begin+maxlen)+","+maxlen+","+ begin +","+(begin+maxlen));return maxlen;}public static void main(String[] args) {// TODO Auto-generated method stubMax_substring max = new Max_substring();char[] s = {'a','x','b','d','e','b','p','q','a','w','u','v','a'};max.max_unique_substring(s);}}
方法二:贪心算法,时间复杂度O(N)
0123456789101112axbdebpqawuva j i i
通过一次遍历字符串数组,利用哈希表记录已经遍历过的字符;算法过程中维护着一个不重复的子串以及他的长度,如果出现了重复的字符则更新不重复子串的起始点并更新最大不重复子串的长;如上图 j 为子串的起点,i 为子串的终点;此时位置 5 处的 b 在 位置2处出现过,就需要更新 j 使其到达位置3处的 d ,此时子串就变为了deb 长度为3;按此逻辑推理下去就会找到最长不重复子串debpaawuv 长度为9.
public class Max_substring2 {public int max_substring(char[] str){int length = str.length;int begin = 0; //记录最长子串的起点 以便输出最长串int end = 0;//记录最长子串的终点 以便输出最长串int maxlen = 0; //最长不重复字符串长度int j = 0;//记录当前不重复字符串的起点int i = 0; //记录当前不重复字符串的终点int hs[] = new int[128]; //用数组代替哈希表mapint k =0;/* 将模拟hashmap的数组初始化*/while(k < 128){hs[k] = -1;k++;}//遍历字符数组while(i < length){ if(hs[str[i]-0] >= j){ //如果当前维护的不重复子串中出现了str[i]j = hs[str[i]-0]+1; //更新j}else{ //如果当前维护的不重复子串没有出现str[i]if(i-j+1 > maxlen){maxlen = i-j+1; /*更新结果取较大者*/begin = j; /* 并记录当前较大子串的起点*/end = i; /* 并记录当前较大子串的终点*/}}hs[str[i]-0] = i; //更新map(实际上是更新模拟map的数组)i++;}//打印输出最长串for(int m = begin; m <= end; ++m){System.out.print(str[m]);}return maxlen;}public static void main(String[] args) {// TODO Auto-generated method stubMax_substring2 mxs = new Max_substring2();char[] str = {'a','x','b','d','e','b','p','q','a','w','u','v','a'};int maxlen = mxs.max_substring(str);System.out.println(" 最大不重复子串的长度: "+maxlen);}}
1 0
- 找出字符串的最长不重复子串,输出长度
- 找出字符串最长不重复子串,输出长度
- 找出字符串的最长不重复子串,输出长度
- 找出字符串的最长不重复子串,输出长度
- 找出字符串的最长不重复子串
- 【面试】字符串最长不重复子串长度。
- 字符串最长不含重复字符的子串长度
- 找出一个字符串中最长的连续数字子串,输出该字符串及长度
- 找出字符串中出现重复而且长度最长的字符串,并且输出而且输出其长度
- 找出字符串中最长的数字子串并指出位置长度,输出。
- python实现找出来一个字符串中最长不重复子串
- 求字符串的不重复字符的最长子串长度的问题
- LeetCode OJ 3.求字符串中最长不重复子串长度问题
- 求一个字符串的最长不重复子串的最大长度
- 求字符串的不重复字符的最长子串长度的问题
- 求字符串中不包含重复字符的最长子串的长度
- 求字符串中不重复的最长子串的长度
- 输入字符串,找出相同且长度最长的子字符串,输出
- 证券数据接口 查询证券编码及基本上市信息
- Remix OS——一个很有魅力的Android系统
- 3GPP TS 24.301 V12.4.0 中文版---5.1&5.2&5.3
- debian 163源
- Virtualbox WDDM 用户模式显示驱动之OpenAdapter
- 找出字符串最长不重复子串,输出长度
- 自定义模式对话框
- Python--函数return后面的语句不执行
- PHP 常用设计模式 总结
- 项目汇报XMind 6来帮您
- 由TNS: 无法解析指定的连接标识符引发的追溯
- 英文论文中常见拉丁语/英语缩写整理
- WPF模拟键盘输入相关问题
- Android之路-启程2:Android开发环境简介以及编写第一个应用程序“HelloWorld”