为您提供了一个字符串S,您必须找到S的所有令人惊奇的子字符串。
Amazing Substring是一个以元音(a,e,i,o,u,A,E,I,O,U)开头的字符串。
输入
给出的唯一参数是字符串S。
输出
返回一个整数X mod 10003,这里X是给定字符串中惊人子字符串的数量。
约束
示例
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 。
请帮助我改进上述算法。感谢您的帮助
答案 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;
。有两个元音,ABEC
和A
。
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)) )