从给定的字符串中查找元音的子数组

时间:2019-03-20 18:10:06

标签: python arrays string algorithm

为您提供了一个字符串S,您必须找到S的所有令人惊奇的子字符串。

Amazing Substring是一个以元音(a,e,i,o,u,A,E,I,O,U)开头的字符串。

输入

给出的唯一参数是字符串S。

输出

返回一个整数X mod 10003,这里X是给定字符串中惊人子字符串的数量。

约束

  • 1 <=长度(S)<= 1e6
  • S可以有特殊字符

示例

Input
    ABEC

Output
    6

Explanation
    Amazing substrings of given string are :
    1. A
    2. AB
    3. ABE
    4. ABEC
    5. E
    6. EC
    here number of substrings are 6 and 6 % 10003 = 6.

针对上述问题,我已经实现了以下算法。

    class Solution:
        # @param A : string
        # @return an integer
        def solve(self, A):
            x = ['a', 'e','i','o', 'u', 'A', 'E', 'I', 'O', 'U']
            y = []
            z = len(A)
            for i in A:
                if i in x:
                    n = A.index(i)
                    m = z
                    while m > n:
                        y.append(A[n:m])
                        m -= 1
            if y:
                return len(y)%10003
            else:
            return 0

“以上解决方案”适用于正常长度的字符串,但不适用于更长的字符串。

例如,

A = "pGpEusuCSWEaPOJmamlFAnIBgAJGtcJaMPFTLfUfkQKXeymydQsdWCTyEFjFgbSmknAmKYFHopWceEyCSumTyAFwhrLqQXbWnXSn"

算法上面输出1630 个子数组,但预期答案是1244

请帮助我改进上述算法。感谢您的帮助

4 个答案:

答案 0 :(得分:6)

专注于所需的输出:您无需查找所有这些子字符串。您只需要子字符串的数量

再次查看您的简短示例 select HOSP_DISCH_TIME, HOSP_ADMSN_TIME, TO_DATE(HOSP_DISCH_TIME, 'YYYY-MM-DD') - TO_DATE(HOSP_ADMSN_TIME, 'YYYY-MM-DD') as Days from PAT_ENC_HSP; 。有两个元音,ABECA

  • E位于位置0。总共有4个子字符串,在此位置以及随后的每个位置结束。
  • A位于位置2。总共有2个子字符串,在此位置以及随后的每个位置结束。

2 + 4 => 6

您需要做的就是找到每个元音的位置,从字符串长度中减去,然后累加这些差异:

E

输出:

A = "pGpEusuCSWEaPOJmamlFAnIBgAJGtcJaMPFTLfUfkQKXeymydQsdWCTyEFjFgbSmknAmKYFHopWceEyCSumTyAFwhrLqQXbWnXSn"

lenA = len(A)
vowel = "aeiouAEIOU"
count = 0

for idx, char in enumerate(A):
    if char in vowel:
       count += lenA - idx

print(count%10003)

在一个命令中:

1244

答案 1 :(得分:3)

当您敲击字符串中的元音时,以该元音开头的所有子字符串都是“惊人的”,因此您可以对它们进行计数:

def solve(A):
            x = ['a', 'e','i','o', 'u', 'A', 'E', 'I', 'O', 'U']
            ans = 0

            for i in range(len(A)):
                if A[i] in x:
                    ans = (ans + len(A)-i)%10003
            return ans

答案 2 :(得分:0)

在查找元素n = A.index(i)的索引时,将获得该元素首次出现的索引。通过使用enumerate,您可以同时遍历索引和元素。

def solve(A):
    x = ['a', 'e','i','o', 'u', 'A', 'E', 'I', 'O', 'U']
    y = []
    z = len(A)
    for n,i in enumerate(A):
        if i in x:
            m = z
            while m > n:
                y.append(A[n:m])
                m -= 1
    if y:
        return len(y)%10003
    else:
        return 0

答案 3 :(得分:0)

更通用的解决方案是找到所有令人惊奇的子字符串,然后计算它们:

print( sum(len(A) - idx if char.lower() in "aeiou" else 0
       for idx, char in enumerate(A)) )