只是刷一些简单的java东西。我试图检查一个字符串是否是唯一的,我想通过递归最好的方法是这样做。这是我到目前为止所得到的,但是我得到了一个出界的错误,显然我忽略了一些非常简单的事情:
public class uniqueCharString {
public static void main(String [] args){
String a = "abcdefghijk";
System.out.println(unique(a));
}
public static boolean unique(String s){
if(s.substring(1).contains(String.valueOf(s.charAt(0)))){
return false;
}
else return unique(s.substring(1));
}
}
好的,所以我完成了自己的思考方式。我从你们那里得到了一些很好的建议,但我想完成我的思考过程。这个解决方案与你们所说的使用套装的一些解决方案相比如何?
public static boolean unique(String s){
for(int x = 0; x < s.length(); x++){
if(s.substring(x+1).contains(String.valueOf(s.charAt(x)))){
return false;
}
}
return true;
}
答案 0 :(得分:4)
最有效的方法是使用Set。迭代每个字符并将它们添加到集合中。如果add操作返回false,则该字符已经在您的集合中,并且String具有非全部唯一字符,否则所有字符都是唯一的
String s = "some string blah blah blah";
Set<Character> set = new HashSet<>();
for (char c : s.toCharArray())
{
boolean elementFirstAdded = set.add(c);
if (!elementFirstAdded)
//Duplicate
}
//Not duplicate
答案 1 :(得分:3)
就像@Kon所说,一个集合(可能)更有效率。
但是,要使用递归,您需要添加终止条件:您的函数永远不会返回true!
零或一个长度的字符串必须是唯一的(好吧,唯一的零长度有点模棱两可......):在顶部添加:
if (s.length() <= 1) {
return true;
}
答案 2 :(得分:0)
另一种做法,如果你对性能调整作业问题感到疯狂:)
public static boolean unique(String s) {
BitSet chars = new BitSet(Character.SIZE);
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (chars.get(c)) {
return false;
}
chars.set(c);
}
return true;
}
答案 3 :(得分:0)
如果您不需要知道重复的内容,我会将所有内容都放入Set()中,因为Set()不能包含重复项。它们永远不会被添加到Set()中。如果你只是想知道你是否有重复,你可以检查之前的字符串的长度,然后检查之后的HashSet()的大小。 像这样:
String a = "abcdefghijk";
String[] ary = a.split("");
Set<T> mySet = new HashSet<T>(Arrays.asList(words))
if (mySet.size() != ary.length){
//do something
}