78 lines
2.5 KiB
Java
78 lines
2.5 KiB
Java
/*
|
|
Given a string, find the longest substrings without repeating characters. Iterate through the given string, find the longest maximum substrings.
|
|
|
|
*/
|
|
|
|
import java.util.HashSet;
|
|
import java.util.Set;
|
|
|
|
public class MyLongestSubstr
|
|
{
|
|
|
|
private Set<String> subStrList = new HashSet<String>();
|
|
private int finalSubStrSize = 0;
|
|
|
|
public Set<String> getLongestSubstr(String input)
|
|
{
|
|
//reset instance variables
|
|
subStrList.clear();
|
|
finalSubStrSize = 0;
|
|
// have a boolean flag on each character ascii value
|
|
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 subStrList;
|
|
}
|
|
|
|
private 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() > finalSubStrSize)
|
|
{
|
|
finalSubStrSize = subStr.length();
|
|
subStrList.clear();
|
|
subStrList.add(subStr);
|
|
}
|
|
else if(subStr.length() == finalSubStrSize)
|
|
{
|
|
subStrList.add(subStr);
|
|
}
|
|
return sb.toString();
|
|
}
|
|
|
|
public static void main(String a[])
|
|
{
|
|
MyLongestSubstr mls = new MyLongestSubstr();
|
|
System.out.println(mls.getLongestSubstr("java2novice"));
|
|
System.out.println(mls.getLongestSubstr("java_language_is_sweet"));
|
|
System.out.println(mls.getLongestSubstr("java_java_java_java"));
|
|
System.out.println(mls.getLongestSubstr("abcabcbb"));
|
|
}
|
|
} |