找到Anagrams的算法的时间复杂度和空间复杂度是多少?

时间:2015-03-02 04:30:50

标签: java algorithm data-structures time-complexity space-complexity

我正在处理来自Amazon Software的面试问题 问题是"设计一个算法来获取字符串列表以及单个输入字符串,并返回列表的索引,它们是输入字符串的字谜,忽略特殊字符。&#34 ;
我能够很好地设计算法,我在psuedo代码中做了什么 1.创建单个输入字符串的数组字符数 2.对于每个字符串列表,构造一个数组字符数
3.将列表中每个字符串的字符数与单个输出字符串
进行比较 4.如果相同,将其添加到包含字谜所有索引的列表中。
5.返回索引列表。

这是我在Java中的实现(它可以工作,测试它)

public static List<Integer> indicesOfAnag(List<String> li, String comp){
    List<Integer> allAnas = new ArrayList<Integer>();
    int[] charCounts = generateCharCounts(comp);
    int listLength = li.size();
    for(int c=0;c<listLength; c++ ){ 
        int[] charCountComp = generateCharCounts(li.get(c));
        if(isEqualCounts(charCounts, charCountComp))
            allAnas.add(c);
    }
    return allAnas;
}
private static boolean isEqualCounts(int[] counts1, int[] counts2){
    for(int c=0;c<counts1.length;c++) {
        if(counts1[c]!=counts2[c]) 
            return false;
    }
    return true;
}
private static int[] generateCharCounts(String comp) {
    int[] charCounts = new int[26];
    int length = comp.length();
    for(int c=0;c<length;c++) {
        charCounts[Character.toLowerCase(comp.charAt(c)) - 'a'] ++;
    }
    return charCounts;
}

由于列表和每个字符串的大小,我遇到的问题是分析此算法的空间和时间复杂度。
时间复杂度算法是否为O(N)其中N是列表的大小(处理每个字符串一次)还是我必须考虑每个字符串长度的复合复杂度,在这种情况下,O(N * n)其中n是字符串的长度?我做了N * n因为你处理n次N次。并且空间复杂度是O(N)因为我正在创建26个长度数组的N个副本吗?

1 个答案:

答案 0 :(得分:2)

  

空间复杂度是否为O(N),因为我正在创建26个长度数组的N个副本?

  

时间复杂度算法是否只是O(N),其中N是列表的大小

没有。时间取决于输入字符串的大小,它是O(comp.length + sum_of_li_lengths)。