需要减少我的程序的运行时间

时间:2015-06-21 04:24:56

标签: python string

我有一个问题,我必须找到一个字符串的连续子串,条件是子串的第一个和最后一个字母必须相同。我尝试过这样做,但运行时超过了几个测试用例的问题的时间限制。我尝试使用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)

2 个答案:

答案 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>