2015-11-23 2 views
0

Код очень прост. Он проверяет все символы один раз и заменяет их первое появление. Однако он не подходит для ввода = "aab". Я не знаю почему. Язык программирования - java.Узнайте, содержит ли строка уникальные символы или нет

public class Solution { 
/** 
* @param str: a string 
* @return: a boolean 
*/ 
public boolean isUnique(String str) { 
    // write your code here 
    for(int i = 0; i <= 127; i++) { 
     s = Character.toString((char) i); 
     if(str.contains(s)) 
     str = str.replaceFirst(s, ""); 
    } 
    if(str.length() == 0) 
    return true; 
    return false; 
    } 
} 

EDIT

Я изменил код. Теперь его метание ошибки ввода

[email protected]#$%^&*()_+ 

Ошибка:

Исключение в потоке "основной" java.util.regex.PatternSyntaxException: незавершенная группа рядом с индексом 1 (^ в java.util.regex.Pattern. error (Pattern.java:1924) в java.util.regex.Pattern.accept (Pattern.java:1782) в java.util.regex.Pattern.group0 (Pattern.java:2857) в java.util.regex.Pattern .sequence (Pattern.java:2018) в java.util.regex.Pattern.expr (Pattern.java:1964) в java.util.regex.Pattern.compile (Pattern.java:1665) в java.util.regex. Шаблон. (Pattern.java:1337) в java.util.regex.Pattern.compile (Pattern.java:1022) в java.lang.String.replaceFirst (String.java:2119) в Solution.isUnique (Solution.java: 12) в Главном .main (Main.java:11)

+0

На данный момент он заменяет весь символ символом «» (пустой) и atlast 'str.length()' всегда 0 –

+0

@TejuMB Моя идея - проверить каждый символ один раз и заменить его первым вступлением. Я до сих пор не понимаю, как длина всегда 0 –

ответ

0

Проблема заключается в том, что replaceFirst имеет в качестве первого аргумента регулярное выражение. Так он играет хаос на \, ^, . и другие. Для этого вы можете использовать:

str = str.replaceFirst(Pattern.quote(s), ""); 

Это было бы сделать из полукокса "(" Узор "\\(".

И в конце просто вернуться:

return str.isEmpty(); 

Или вы могли бы быть удовлетворены исключительно contains:

int uniques = 0; 
for (int i = 0; i <= 127; i++) { 
    s = Character.toString((char) i); 
    if (str.contains(s)) { 
     ++uniques; 
    } 
} 
return str.length() == uniques; 

Ваш алгоритм должен работать для US-ASCII.

+1

Ваш ответ сказочный. Хотя метод шаблонов не работает на lintcode, где я занимаюсь вопросами. В любом случае вторая часть работала нормально. –

0

ПРИМЕЧАНИЕ: Поскольку вы не упомянули язык программирования, который вы использовали. Я считал это C#.

РЕШЕНИЕ:

public class Solution { 
    /** 
    * @param str: a string 
    * @return: a boolean 
    */ 
    public boolean isUnique(String str) { 
     // write your code here 
     for(int i = 0; i <= 127; i++) { 
      int count = str.Split(Character.ToString((char) i)).Length - 1; 
      if(count>0) 
       return false; 
     } 
     } 
    } 
+0

Язык - это Java. Я не знаком с C#, поэтому я не понимаю, что вы здесь сделали –

+0

ой, я не знаком со стандартными функциями Java. –

Смежные вопросы