The challenge I am going to explain is the Jewels and Stones challenge, which, by the way, is a concise one. The description of the problem is as follows:

You’re given strings J representing the types of stones that are jewels, and S representing the stones you have. Each character in S is a type of stone you have. You want to know how many of the stones you have are also jewels.

The letters in J are guaranteed distinct, and all characters in J and S are letters. Letters are case sensitive, so "a" is considered a different type of stone from "A".

Example 1:

Input: J = "aA", S = "aAAbbbb"
Output: 3

Example 2:

Input: J = "z", S = "ZZ"
Output: 0

Thus, each jewel from the String J is compared with each stone I have. If the jewel matches the stone I have, it means that I have a jewel. After all the stones are compared, the function returns the number of jewels I have.

class Solution(object):
def numJewelsInStones(self, J, S):
"""
:type J: str
:type S: str
:rtype: int
"""
'''
J - types of stones that are jewels (J distinct)
S - stones you have
Each char in S is a type of stone I have
'''
# take each stone from J an check if it is found in S
return sum(stone in J for stone in S)

The following line:

return sum(stone in J for stone in S)

Can be restructured as follows:

count = 0
for jewel in J:
for stone in S:
if jewel == stone:
count += 1
return count

For the moment, I prefer the second solution because it is easier for a beginner like me to understand what is happening. Nonetheless, the first solution is more beautiful and quicker.