我有一个问题,我必须找到一个字符串的连续子串,条件是子串的第一个和最后一个字母必须相同。我尝试过这样做,但运行时超过了几个测试用例的问题的时间限制。我尝试使用map作为for循环,但我不知道如何为嵌套for循环做什么。任何人都可以帮我减少这个程序的运行时间吗?
n = int(raw_input())
string = str(raw_input())
def get_substrings(string):
length = len(string)
list = []
for i in range(length):
for j in range(i,length):
list.append(string[i:j + 1])
return list
substrings = get_substrings(string)
contiguous = filter(lambda x: (x[0] == x[len(x) - 1]), substrings)
print len(contiguous)
答案 0 :(得分:0)
如果我理解了这个问题,请告诉我,如果不是这样的话,请试试这个:
不确定这是否会加快运行时间,但我相信这个算法可能会使用更长的字符串(消除嵌套循环)。迭代字符串一次,将每个字符的索引(位置)存储在具有恒定时间查找的数据结构中(如果设置正确,则为hashmap或数组)。完成后,您应该拥有一个存储每个角色的所有不同位置的数据结构。使用此功能,您可以轻松检索子字符串。
示例:
codingisfun
以字母i为例,在完成我上面所说的之后,你在hashmap中查找它并看到它出现在索引3和6中。这意味着你可以做一些类似substring(3,6)的东西来获取它。
不是最好的代码,但对于起点似乎是合理的......你可以用一些创造性的思维来消除循环:
import string
import itertools
my_string = 'helloilovetocode'
mappings = dict()
for index, char in enumerate(my_string):
if not mappings.has_key(char):
mappings[char] = list()
mappings[char].append(index)
print char
for char in mappings:
if len(mappings[char]) > 1:
for subset in itertools.combinations(mappings[char], 2):
print my_string[subset[0]:(subset[1]+1)]
答案 1 :(得分:0)
问题是你的代码在算法复杂性方面效率太低。
这是一个替代方案(我相信一个更清洁,但稍微慢一点的soliman版本)
public class User {
public long id;
public boolean active;
public String email;
public String googlePlusId;
public String facebookId;
public String name;
public String avatarUrl;
public String coverPhotoUrl;
}
您的解决方案的算法问题是,当您可以轻松确定单个线性时间过程中的实际对时,您可以盲目地检查每个可能的子字符串。如果您只想要计数,可以在O(MN)时间内轻松确定,对于长度为N和M的唯一字符串(给定char的出现次数,您可以在数学上计算出有多少个子串) 。当然,在最坏的情况下(所有字符都是相同的),你的代码将具有与我们相同的复杂性,但由于你有一个嵌套的for循环(n ^ 2次),你的平均情况复杂性更差。 p>