算法题之——最大子串
来源:互联网 发布:软件合作模式吗 编辑:程序博客网 时间:2024/06/03 06:59
算法题之——最大子串
题目:给定一字符串只包含数字,请写一个算法,找出该字符串中的最长不重复子串(不重复是指子串中每一元素不同于子串中其他元素)
如: “120135435”最长不重复子串为 “201354”
代码:
方法一:
//辅助数组,o(n*n) private static String noRepeatSubString(String str){ int a[] = new int[10]; int maxlength = 0; int maxindex = 0; int j; for(int i=0;i<str.length();i++){ for(j=0;j<10;j++) a[j] = 0; char c = str.charAt(i); a[c-'0'] = 1; for(j=i+1;j<str.length();j++){ if(a[str.charAt(j)-'0']==0){ a[str.charAt(j)-'0'] = 1; }else{ if(maxlength<j-i){ maxlength = j-i; maxindex = i; } break; } } if((j==str.length())&&(j-i>maxlength)){ maxlength = j-i; maxindex = i; } } System.out.println(maxindex); return str.substring(maxindex, maxindex+maxlength-1); }
方法二:
/** * 数组dp存储到下标i的最大子数组长度 * 比如字符串"aabcdb" * 则dp[0]=1(a),dp[1]=1(a),dp[2]=2(ab),dp[3]=3(abc),dp[4]=4(abcd),dp[5]=3(cdb) * o(n*n) * 可改进 * @param str * @return */ private static String noRepeatSubString1(String str){ int dp[] = new int[str.length()]; dp[0] = 1; int maxlen=0,maxindex = 0; int last_start = 0; for(int i=1;i<str.length();i++){ for(int j=i-1;j>=last_start;j--){ if(str.charAt(i)==str.charAt(j)){ dp[i] = i-j; last_start = j+1; break; }else if(j==last_start){ dp[i] = dp[i-1]+1; } } if(dp[i]>maxlen){ maxlen = dp[i]; maxindex = i+1-maxlen; } } return str.substring(maxindex, maxindex+maxlen-1); }
方法三:
/**时间复杂度o(n) * 120135435 * @param str * @return */ private static String noRepeatSubString2(String str){ //记录数字出现的位置 int visit[] = new int[10]; //记录到达i的最大子串的长度 int dp[] = new int[str.length()]; int last_start = 0; int maxlen=0,maxindex=0; for(int i=0;i<10;i++){ visit[i] = -1; } for(int i=0;i<str.length();i++){ dp[i] = 0; } visit[str.charAt(0)-'0'] = 0; dp[0] = 1; for(int i=1;i<str.length();i++){ int tmp = str.charAt(i)-'0'; if(visit[tmp]==-1){ dp[i] = dp[i-1]+1; visit[tmp]=i; }else{ if(last_start<=visit[tmp]){ last_start = visit[tmp]+1; dp[i] = i-visit[tmp]; visit[tmp] = i; }else{ dp[i] = dp[i-1]+1; visit[tmp] = i; } } if(dp[i]>maxlen){ maxlen = dp[i]; maxindex = i+1-maxlen; } } return str.substring(maxindex, maxlen+maxindex-1); }
改进方法三:
/** * noRepeatSubString2的优化 * @param str * @return */ private static String noRepeatSubString3(String str){ int visit[] = new int[10]; //记录到达i的最大子串的长度 int count = 1; int last_start = 0; int maxlen=0,maxindex=0; for(int i=0;i<10;i++){ visit[i] = -1; } visit[str.charAt(0)-'0'] = 0; for(int i=1;i<str.length();i++){ int tmp = str.charAt(i)-'0'; if(visit[tmp]==-1){ count++; visit[tmp]=i; }else{ if(last_start<=visit[tmp]){ last_start = visit[tmp]+1; count = i-visit[tmp]; visit[tmp] = i; } } if(count>maxlen){ maxlen = count; maxindex = i+1-maxlen; } } return str.substring(maxindex, maxlen+maxindex-1); }
阅读全文
0 0
- 算法题之——最大子串
- 算法题之——连续子数组最大和
- 算法之最大子串和
- 最大子串算法
- 算法之最大子数组
- Manacher——最大回文子串的线性算法
- 算法导论——最大子数组
- 算法导论——最大子数组
- 初学算法——最大子序列
- 算法导论—最大子数组问题
- 算法题2 动态规划之最大子序列和&最大子矩阵和
- 算法之插入、归并排序,最大公共子串lcs
- 算法复习之:最大子串和问题
- 笔试——字符串算法题——寻找最大回文子串
- [算法]最大子串和
- 数据结构——算法之(006)(求子数组的最大和)
- 算法重拾之路——最大子段和
- 算法学习(一)——分治策略之最大子数组问题(Java实现)
- 梯度下降
- 第一章 Solidity源文件的结构
- LeetCode-----把'O'变成'X'
- EasyNVR H5无插件直播方案前端架构之:videojs的使用
- Socket之UDP和TCP协议
- 算法题之——最大子串
- java学习必须有明确的路线规划!
- Java 字符串List转int List
- 转义非转义
- 图片上传之前的预览问题
- Android Studio中的TODO和FIXME
- 傻瓜式monkey启动方式
- 1. Two Sum(两数之和) —— Java
- 使用spring-boot-starter-data-jpa 怎么配置使运行时输出SQL语句