# CSPT27 Lecture 7
## Jewels & Stones
```
class Solution:
"""
Understand
jewels = "aA", stones = "aAAbbbb"
output = 3
jewels = "z", stones = "ZZ"
output = 0
jewels = "z", stones = "zzz"
output = 3
Plan
Brute-force
For each stone, check if it's a jewel. Keep track of the number
of jewels found.
Runtime: O(n^2)
Space: O(1)
Another approach
Transform jewels into a set. Then check if each stone is in that set.
Keep track of num jewels found.
Runtime: O(m + n) where m = len(jewels), n = len(stones)
Space: O(m)
"""
def numJewelsInStones(self, jewels: str, stones: str) -> int:
j = set(jewels) # O(m) where m = len(jewels)
numJewels = 0
for s in stones: # O(n) where n = len(stones)
if s in j: # O(1)
numJewels += 1
return numJewels
```
## Numbers Smaller than Number
```
class Solution:
"""
Understand
nums = [8,1,2,2,3]
output = [4,0,1,1,3]
nums = [1,1,1]
output = [0,0,0]
nums = [4,3,2,1]
output = [3,2,1,0]
nums = [1,2,3]
output = [0,1,2]
Plan
Brute-force Approach
For each number, iterate through all other numbers
and keep track of how many elements are < it.
Runtime: O(n^2)
Space: O(n)
Hint: Use sorting + hash-and-store
Runtime: O(nlogn)
Space: O(n)
"""
def smallerNumbersThanCurrent(self, nums: List[int]) -> List[int]:
sortedNums = sorted(nums)
numMap = {}
for i, num in enumerate(sortedNums):
if num not in numMap:
numMap[num] = i
res = []
for num in nums:
res.append(numMap[num])
return res
```
## Keyboard Row
```
class Solution:
"""
Understand
words = ["Hello","Alaska","Dad","Peace"]
output = ["Alaska","Dad"]
words = ["Hello","Peace"]
output = []
words = ["Dad", "YOU", "z"]
output = ["Dad", "YOU", "z"]
Plan
Create a set for each row
Go through each word, find out which row the first
character belongs to. Then check if all other chars
are also in that same set. Early terminate if
you find a character that's not in that set and go
to the next word. If you go through all characters in that
word, then append that to your output list.
Runtime: O(number of words * max(number of letters in word))
Space: O(number of words)
"""
def findWords(self, words: List[str]) -> List[str]:
rows = [set(["q","w","e","r","t","y","u","i","o","p"]), set(["a","s","d","f","g","h","j","k","l"]), set(["z","x","c","v","b","n","m"])]
res = [] # n
for word in words:
rowFirstLetterBelongsTo = set()
for row in rows:
if word[0].lower() in row:
rowFirstLetterBelongsTo = row
break
allLettersAreInSameRow = True
for i in range(1, len(word)): # m where m = len(longestWord)
if word[i].lower() not in rowFirstLetterBelongsTo:
allLettersAreInSameRow = False
break
if allLettersAreInSameRow:
res.append(word)
return res
```