我正在处理来自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个副本吗?
答案 0 :(得分:2)
空间复杂度是否为O(N),因为我正在创建26个长度数组的N个副本?
是
时间复杂度算法是否只是O(N),其中N是列表的大小
没有。时间取决于输入字符串的大小,它是O(comp.length + sum_of_li_lengths)。