[英]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
每个字符追加到另一个String
或StringBuilder
直到您追加新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.