简体   繁体   English

从字符串中找出 substring 具有最大长度且字符不应重复

[英]Find out the substring from String which has maximum length and character should not be repeated

I want to find the the substring from String s = "CHARACTERSTIC".我想从 String s = "CHARACTERSTIC" 中找到 substring。 Requirement is that substring should not contain repeated characters as well as substring should have maximum length.要求是 substring 不应包含重复字符,并且 substring 应具有最大长度。 How to achive this in core java?如何在核心 java 中实现这一点? Please help me as i am quite novice to java.请帮助我,因为我对 java 还很陌生。

Hope this helps :)希望这可以帮助 :)

   import java.util.HashSet;
   import java.util.Scanner;
   import java.util.Set;

   public class MyLongestSubstr {

   static Set<String> SubStringList = new HashSet<String>();
   static int Size = 0;

    public static  Set<String> getLongestSubstr(String input){
    SubStringList.clear();
    Size = 0;
    boolean[] flag = new boolean[256];
    int j = 0;
    char[] inputCharArr = input.toCharArray();
    for (int i = 0; i < inputCharArr.length; i++) {
        char c = inputCharArr[i];
        if (flag[c]) {
            extractSubString(inputCharArr,j,i);
            for (int k = j; k < i; k++) {
                if (inputCharArr[k] == c) {
                    j = k + 1;
                    break;
                }
                flag[inputCharArr[k]] = false;
            }  
        } else {
            flag[c] = true;
        }
    }
    extractSubString(inputCharArr,j,inputCharArr.length);
    return SubStringList;
}

private static String extractSubString(char[] inputArr, int start, int end){

    StringBuilder sb = new StringBuilder();
    for(int i=start;i<end;i++){
        sb.append(inputArr[i]);
    }
    String subStr = sb.toString();
    if(subStr.length() > Size){
        Size = subStr.length();
        SubStringList.clear();
        SubStringList.add(subStr);
    } else if(subStr.length() == Size){
        SubStringList.add(subStr);
    }

    return sb.toString();
}

public static void main(String a[]){
    Scanner sc = new Scanner(System.in);
    String str = sc.next();
    System.out.println(getLongestSubstr(str));

}
}  

This solution prints out such possible sub-strings with maximum length and no repeating characters.此解决方案打印出具有最大长度且没有重复字符的此类可能子字符串。

Try this :-尝试这个 :-

/**
 * Method to get List of all possible non-repetitive String from input String
 */
public ArrayList<String> getUniqueSubstring(String input) {
    ArrayList<String> matchingString = new ArrayList<String>();
    for (int i = 0; i < input.length(); i++) {
        String s = String.valueOf(input.charAt(i));
        for (int j = i + 1; j < input.length(); j++)
            if (!s.contains(String.valueOf(input.charAt(j))))
                s += String.valueOf(input.charAt(j));
            else
                break;
        matchingString.add(s);
        if (s.length() == input.length())
            break;
    }

    return matchingString;
}

/**
 * Method to get longest String out of List
 */


public String getLongestString(List<String> list) {
      int maxLength = 0;
      String longestString = null;
      for (String s : list) {
          if (s.length() > maxLength) {
              maxLength = s.length();
              longestString = s;
          }
      }
      return longestString;
  }

/**
 * Main method to test & print the longest string
 */
public static void main(String[] args) {
    StringPattern s = new StringPattern();
    System.out.println(s.getLongestString(s.getUniqueSubstring("CHARACTERSTIC")));
}

Output :- ACTERS输出:- ACTERS

PS:- Please try to create logic on your own & ask for help here if you are stuck somewhere, not for ready baked code. PS:-请尝试自己创建逻辑,如果您被困在某处,请尝试在此处寻求帮助,而不是现成的烘焙代码。 If you are novice start your leaning from Oracle Docs here Hope this helps.如果您是新手,请从这里开始学习 Oracle Docs 希望这会有所帮助。

You would want to append each character from your original String to another String or StringBuilder until you're appending a character that is already in your new String .您可能希望将原始String每个字符追加到另一个StringStringBuilder直到您追加新String已有的字符。 Once you've reached either the end of your original String or come to a duplicate character, check if the new String is the longest and keep it if it is.一旦到达原始String或遇到重复字符,请检查新String是否最长,如果是则保留它。

Sample:样本:

public static void main(String[] args) throws Exception {
    String s = "CHARACTERSTIC";
    StringBuilder sb = new StringBuilder();

    String maxString = "";
    int maxStringLength = 0;
    int index = 0;
    while (index < s.length()) {
        String c = String.valueOf(s.charAt(index));
        if (sb.indexOf(c) == -1) {
            sb.append(c);
            index++; // Go to the next character
        } 

        // Check if we're at the end of the string of if the next character is duplicate
        if (index == s.length() || sb.indexOf(String.valueOf(s.charAt(index))) > -1) {
            System.out.println("Possible substring: " + sb);

            // Have to check the last substring
            if (sb.length() > maxStringLength) {
                maxString = sb.toString();
                maxStringLength = maxString.length();
                sb.setLength(0);
            }
        }
    }

    System.out.println("Max String: " + maxString);
    System.out.println("Max Length: " + maxStringLength);
}

Results:结果:

Possible substring: CHAR
Possible substring: ACTERS
Possible substring: TIC
Max String: ACTERS
Max Length: 6

This has a fix for @Shar1er80 code for a String like "abcan" where max string might be "bcan":这对 @Shar1er80 代码的字符串(如“abcan”)进行了修复,其中最大字符串可能是“bcan”:

public String getMaxSubstring(String s) {
    StringBuilder currentString = new StringBuilder();
    String maxString = "";
    int index = 0;
    while(index < s.length()) {
            if(currentString.indexOf(String.valueOf(s.toCharArray()[index])) == -1) {
                currentString.append(s.toCharArray()[index]);

            }else {
                // this will take care of already skipped substrings
                String ns = currentString.substring(currentString.indexOf(String.valueOf(s.toCharArray()[index]))+1) + String.valueOf(s.toCharArray()[index]);
                currentString = new StringBuilder(ns);
                currentString.setLength(ns.length());
            }               
            if(currentString.length() > maxString.length()) {
                maxString = currentString.toString();
            }               
            index++;
    }        
    return maxString;
}
private static void highestSubString(String str) {
    String longestSubString =null;
    int longestSubStringLength =0;
    Map<Character,Integer> characterSet = new HashMap<>();
    char[] arr = str.toCharArray();
    for (int i =0;i<arr.length;i++){

        char ch = arr[i];
        if(!characterSet.containsKey(ch)){
            characterSet.put(ch,i);

        }else {

            characterSet.clear();
        }

        if(characterSet.size() > longestSubStringLength){
            longestSubStringLength = characterSet.size();
            longestSubString = characterSet.keySet().toString();
        }

    }
    System.out.println(longestSubStringLength);
    System.out.println(longestSubString);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何使用正则表达式从长字符串中提取重复的 substring - How to extract a substring which is repeated from a long string using regex Java 滑动窗口问题:给定一个字符串,找出最长的子字符串的长度,它包含所有不同的字符。 比较解决方案 - Java Sliding Window Problem: Given a string, find the length of the longest substring, which has all distinct characters. Comparing Solutions 如何找到给定字符串的最长重复子字符串 - How to find the longest repeated substring of given string 如何在字符串中找到最长的连续重复子字符串? - How to find a longest consecutive repeated substring in a string? 查找在Java中重复一个字符串中的字符多少次 - find how many numberof times a character from a String is repeated in java 根据重复的字符构造一个字符串 - Construct a string from a repeated character 如何用匹配 ZE83AED3DDF4667DEC0DAAAACB2BB3BE0BZ 长度的一个字符替换字符串模式? - How to replace string pattern by one character of length of matching substring length? 查找字符串中所有不重复的字符 - find all non repeated character in a string 在字符串中查找非重复字符 - Find non-repeated character in a string 获取具有重复字符Java的字符串的子字符串 - Getting substring of a string that has a repeating character Java
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM