找出给定的一个字符串中最大的不重复子串,不重复子串即一个子串中不出现两个相同的字符

思路一:先找出一个字符串中所有子串,再找出所有子串中最长的那一个;
思路二:每次找出的子串长度都比上一次的子串长,则最后的子串即是最长子串的长度数。
我选择的是第二种方法。

public class FindSubstringMaxlengthNoduplicate {
  public static void main(String[] args) {
  String s = "adcdghcwioizhfksjdyuiodfhjskhgkhgeisdcjdkh";
  ArrayList<String> result = findMaxLength(s);
  int maxLength = result.get(result.size()-1).length();
  System.out.println("最长不重复子串为:");
  for(String r : result){
    if(r.length() == maxLength){
      System.out.println(r);
    }
  }
}

private static ArrayList<String> findMaxLength(String s) {
  int maxLength = 0;
  HashSet<Character> hs = null;
  ArrayList<String> list = new ArrayList<String>();
  for(int j = 0; j < s.length(); ++j){
    int count = 0;
    hs = new HashSet<Character>();
    for(int i = j; i < s.length(); ++i){
      if(hs.add(s.charAt(i))){
        ++count;
        if(count == s.length()-j){
           if(count >= maxLength){
              maxLength = count;
              list.add(s.substring(j,i));
           }
           j = s.length();
        }
      }else{
        if(count >= maxLength){
          maxLength = count;
          list.add(s.substring(j,i));
        }
        int numOfDupllicate = 0;
        for(int k = j; k < i; ++k){
          if(s.charAt(i) != s.charAt(k)){
            ++numOfDupllicate;
          }else{
            break;
          }
        }
        j = j+numOfDupllicate;
        break;
        }
      }
    }
    return list;
  }

}

时间: 2024-10-03 00:27:43

找出给定的一个字符串中最大的不重复子串,不重复子串即一个子串中不出现两个相同的字符的相关文章

(算法:二分查找)在排序数组中,找出给定数字出现的次数

题目: 在排序数组中,找出给定数字出现的次数 思路: 既然出现排序数组,很容易想到二分查找,时间复杂度为O(logn): 先通过二分查找找到最左边出现该数字的下标left(如果没找到,则返回-1),然后通过二分查找找到最右边出现该数字的下表right(如果没找到,则返回-1),然后right-left+1就是出现的次数: 代码: #include <iostream> using namespace std; int BinarySearchCount(int *array,int len,i

9.11排序与查找(五)——有个排序后的字符串数组,其中散布着一些空字符串,找出给定字符串的位置

/** * 功能:有个排序后的字符串数组,其中散布着一些空字符串,找出给定字符串的位置. */ /** * 思路:对二分查找法做修改,与mid比较的地方,如果mid为空字符串,则将mid换到离它最近的非空字符串的位置. * @param strings * @param str * @return */ public static int search(String[] strings,String str){ if(strings==null||str==null||str=="")

[leetcode 周赛 160] 1237 找出给定方程的正整数解

1237 Find Positive Integer Solution for a Given Equation 找出给定方程的正整数解 问题描述 给出一个函数 f(x, y) 和一个目标结果 z,请你计算方程 f(x,y) == z 所有可能的正整数 数对 x 和 y. 给定函数是严格单调的,也就是说: f(x, y) < f(x + 1, y) f(x, y) < f(x, y + 1) 函数接口定义如下: interface CustomFunction { public: // Ret

在由N个元素构成的集合S中,找出最小元素C,满足C=A-B,其中A,B是都集合S中的元素,没找到则返回-1

package bianchengti; /* * 在由N个元素构成的集合S中,找出最小元素C,满足C=A-B, * 其中A,B是都集合S中的元素,没找到则返回-1 */ public class findMinValue { //快速排序 public static void sort(int a[], int low, int hight) { if (low > hight) { return; } int i, j, key; i = low; j = hight; key = a[i]

位运算 找出给定的数中其他数都是两个,有两个是一个的数

题目大意: 给定你n个数, 其中有n-2个数都是两两成对的,有两个是单独出现的,如n = 8, 2 3 2 5 3 6 4 6, 这时候4和5是单独的两个,所以答案就是4,5,其中n的范围是1e6. 思路: 之前做过找一个单独的数的题,那个题是用一个比较巧妙的方法来做的,不过这个也是一类经典问题,用到了强大的位运算,有了那个题的基础再来做这个题就简单了.(附:找一个的题目链接). 刚开始我是用了O(nlogn)的时间复杂度来做的,先排序,然后用类似找一个的方法找出第二个.我觉得对于1e6的数据量

找出一定范围内多个连续整数,使其立方之和恰好等于另一个整数的立方

题目如图,关于这道题的第一问比较简单,只需验证式子两边是否相等即可.这里主要做一下第二问.  此题要求找出多个连续整数的立方和使其恰好等于另一个整数的立方,因为并没有明确给出相应的条件,比如起始项,项数等,所以找出所有结果并不现实.故将起始项a范围定位1~1000,项数n<=1000. 具体的实现思路很简单,先由两个for循环分别确定起始项和项数,通过立方和公式(此公式可自行推导)求出从a~a+n-1立方和,将其和取立方根,得到的立方根再取立方与立方和比较,若相同则输出. 关于代码中出现的立方和

找出给定数数组里连续的元素和的最大值

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication4 {     class Program {         static void Main(string[] args) {             FindMaxAmountValue rr = new FindMaxAmountValue();         

找出给定字符串中出现最多的字符和次数

public static void findMaxCountChar(String str) { if (str == null || str == "") return; Map<String, Integer> map = new HashMap<String, Integer>(); int maxCount = 0; String maxCountStr = ""; List<String> list = new Arr

11.5 排序后的字符串数组,其中散布着空字符串,编写一个方法,找出给定字符串的位置。

二分法变体,当查找到mid元素是空串时,同时向两边扩散寻找不为空串的索引作为mid,继续执行二分. public class Solution { public int search(String[] list, String str) { if (list == null || list.length == 0 || str == null || str.isEmpty()) return -1; return searchHelper(list, str, 0, list.length -