如何在字符串中检查char是否多次出现?

时间:2016-12-29 11:48:31

标签: java

这是我的代码:

static String encode(String word){
    char[] stringToChar = word.toLowerCase().toCharArray();
    String result = word;
    for (char s : stringToChar) {
        if () {   // if char s occurs more than once in a string word it gets replaced by ')'
            result.replace(s, ')');
        } else { // char s occurs only once in a string word so it gets replaced by '('
            result.replace(s, '(');
        }
    }

    return result;
}

它来自CodeWars我无法找到一种方法来检查一个字符串中是否出现过多次字符串。我知道如何替换它(我想我会这样做)但是当我尝试使用嵌套循环检查它是否在那里时,我似乎得到了一些奇怪的结果。

6 个答案:

答案 0 :(得分:3)

你可以做到

// determine if a character has been seen
BitSet previous = new BitSet();
// determine is a character was a duplicate.
BitSet duplicate = new BitSet();
for (int i = 0; i < s.length(); i++) {
    char ch = Character.toLowerCase(s.charAt(i));
    if (previous.get(ch)) 
        duplicate.set(ch);
    else
        previous.set(ch);
}
// create a new string in a single pass without using replace etc.
StringBuilder sb = new StringBuilder(s.length());
for (int i = 0; i < s.length(); i++) {
    char ch = Character.toLowerCase(s.charAt(i));
    // replace duplicates with ) and non duplicates with (
    sb.append(duplicate.get(ch) ? ')' : '(');
}

这是O(n)方法。

你需要做两次通过的原因是"(( @" =&gt; "))(("注意(在结果中是如何重复的,您需要知道()是来自输入还是结果。

答案 1 :(得分:2)

您不需要更换任何可以根据您的要求使用现成功能的内容。

您可以使用:

int count = StringUtils.countMatches("String text", "char");

int occurance = StringUtils.countOccurrencesOf("String text", "char");

Apache Commons Lang 3 Library中提供了StringUtils课程。

摇篮

compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.5'

的Maven

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.5</version>
</dependency>

答案 2 :(得分:1)

首先,您的代码存在巨大缺陷。

而不是

result.replace(s, '(');

你应该写

result = result.replace(s, '(');

然后,我建议首先对字符数组进行排序(如注释中所示;有实用方法)。之后,查找和检查该数组中的字符应该很简单。

答案 3 :(得分:0)

如果您使用的是Apache Commons,可以计算一行中的出现次数,如下所示:

int count = StringUtils.countMatches(stringTocheckForAs, "A");

答案 4 :(得分:0)

如果您不允许在代码大战中导入Apache Commons(我不知道)或者由于某种原因您不想使用它,可以试试这个。

你可以初始化一个大小为26(对于A到Z)或52(对于大写和小)或甚至更大的大小的int(或短)数组(如果输入字符串也可以包含数字,符号等) ) - 将每个元素初始化为值0(零)。在输入字符串的第一次传递中,开始计算每个字符出现的次数 - 在最初初始化的数组中设置此整数值。在输入字符串的下一个传递中,一旦你有字符串中每个字符的计数,如果它只出现一次,打印'('else print')',无论如何。

这也是O(n),但彼得的解决方案更好:)

答案 5 :(得分:0)

这可以帮助通过简单的重复检查,但不检查事件计数

function isIsogram(word) {
    var count = 0;
    var check = ' ';
    if(word == "" || word == null){
        return false;
    }
    var newWord = word.toLowerCase();
    for (var i = 0; i < newWord.length; i++){
        if(check === newWord.charAt(i)){
            return false;
        }
        for(var j = 0; j < newWord.length; j++){
            if(newWord.charAt(i) === newWord.charAt(j)){
                count++;
                if(count > 1){
                    check = newWord.charAt(i);
                }

            }

        }
        count = 0;
    }
    return true;
};