Hackerrank - Weighted Uniform Strings Solution
A weighted string is a string of lowercase English letters where each letter has a weight. Character weights are to from to as shown below:
We define the following terms:
The weight of a string is the sum of the weights of all the string's characters. For example:
- A uniform string consists of a single character repeated zero or more times. For example,
ccc
anda
are uniform strings, butbcb
andcd
are not.
Given a string, , let be the set of weights for all possible uniform contiguous substrings of string . You have to answer queries, where each query consists of a single integer, . For each query, print Yes
on a new line if ; otherwise, print No
instead.
Note: The symbol denotes that is an element of set .
Function Description
Complete the weightedUniformStrings function in the editor below. It should return an array of strings, either Yes
or No
, one for each query.
weightedUniformStrings has the following parameter(s):
- s: a string
- queries: an array of integers
Input Format
The first line contains a string , the original string.
The second line contains an integer , the number of queries.
Each of the next lines contains an integer , the weight of a uniform subtring of that may or may not exist.
Constraints
- will only contain lowercase English letters, ascii[a-z].
Output Format
Print lines. For each query, print Yes
on a new line if . Otherwise, print No
.
Sample Input 0
abccddde
6
1
3
12
5
9
10
Sample Output 0
Yes
Yes
Yes
Yes
No
No
Explanation 0
The weights of every possible uniform substring in the string abccddde
are shown below:
We print Yes
on the first four lines because the first four queries match weights of uniform substrings of . We print No
for the last two queries because there are no uniform substrings in that have those weights.
Note that while de
is a substring of that would have a weight of , it is not a uniform substring.
Note that we are only dealing with contiguous substrings. So ccc
is not a substring of the string ccxxc
.
Sample Input 1
aaabbbbcccddd
5
9
7
8
12
5
Sample Output 1
Yes
No
Yes
Yes
No
Solution in Python
from itertools import groupby
s = input()
p = set((ord(x)-96)*i for x,y in groupby(s) for i in range(1,len(list(y))+1))
for _ in range(int(input())):
print("Yes" if int(input()) in p else "No")