Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SE103 - Week 9, Session 2

Caren
August 08, 2020

SE103 - Week 9, Session 2

Caren

August 08, 2020
Tweet

More Decks by Caren

Other Decks in Education

Transcript

  1. Given a string, find the length of its Longest Palindromic

    Subsequence (LPS). In a palindromic subsequence, elements read the same backward and forward. A subsequence is a sequence that can be derived from another sequence by deleting some or no elements without changing the order of the remaining elements. Longest Palindromic Subsequence
  2. Given a string, find the length of its Longest Palindromic

    Subsequence (LPS). In a palindromic subsequence, elements read the same backward and forward. Example 1
 Given: abdbca
 Return: ?? Longest Palindromic Subsequence
  3. Given a string, find the length of its Longest Palindromic

    Subsequence (LPS). In a palindromic subsequence, elements read the same backward and forward. Example 1
 Given: abdbca
 Return: 5 (abdba) Longest Palindromic Subsequence
  4. Given a string, find the length of its Longest Palindromic

    Subsequence (LPS). In a palindromic subsequence, elements read the same backward and forward. Example 1
 Given: abdbca
 Return: 5 (abdba) Example 2
 Given: cddpd
 Return: ?? Longest Palindromic Subsequence
  5. Given a string, find the length of its Longest Palindromic

    Subsequence (LPS). In a palindromic subsequence, elements read the same backward and forward. Example 1
 Given: abdbca
 Return: 5 (abdba) Example 2
 Given: cddpd
 Return: 3 (ddd or dpd) Longest Palindromic Subsequence
  6. Given a string, find the length of its Longest Palindromic

    Subsequence (LPS). In a palindromic subsequence, elements read the same backward and forward. Example 1
 Given: abdbca
 Return: 5 (abdba) Example 2
 Given: cddpd
 Return: 3 (ddd or dpd)
 
 Example 3
 Given: abc
 Return: ??
 Longest Palindromic Subsequence
  7. Given a string, find the length of its Longest Palindromic

    Subsequence (LPS). In a palindromic subsequence, elements read the same backward and forward. Example 1
 Given: abdbca
 Return: 5 (abdba) Example 2
 Given: cddpd
 Return: 3 (ddd or dpd)
 
 Example 3
 Given: abc
 Return: 1 (a or b or c)
 Longest Palindromic Subsequence
  8. Given: cddpd
 Return: 3 (ddd or dpd) Intuitively…
 Let’s have

    two pointers, one starting at the beginning and one starting at the end
 cddpd
 
 
 Longest Palindromic Subsequence
  9. Given: cddpd
 Return: 3 (ddd or dpd) Intuitively…
 Let’s have

    two pointers, one starting at the beginning and one starting at the end
 cddpd
 
 
 If the letters are the same
 - count of palindromic subsequence = 2
 - recurively do this for the rest of the substring
 
 Longest Palindromic Subsequence
  10. Given: cddpd
 Return: 3 (ddd or dpd) Intuitively…
 Let’s have

    two pointers, one starting at the beginning and one starting at the end
 cddpd
 
 
 If the letters are the same
 - count of palindromic subsequence = 2
 if letters are NOT the same
 - try advancing starting pointer cddpd
 
 - try advancing ending pointer cddpd Longest Palindromic Subsequence
  11. Longest Palindromic Subsequence c != d cddpd ddpd cddp c

    != p d == d
 count = 2 dp d != p p d
  12. Longest Palindromic Subsequence c != d cddpd ddpd cddp c

    != p d == d
 count = 2 dp d != p p d p == p count = 1 d == d count = 1
  13. Longest Palindromic Subsequence c != d cddpd ddpd cddp c

    != p d == d
 count = 2 dp d != p p d p == p count = 1 d == d count = 1 2 + Max(1, 1) = 3
  14. Longest Palindromic Subsequence c != d cddpd ddpd cddp c

    != p d == d
 count = 2 dp d != p p d p == p count = 1 d == d count = 1 2 + 1 = 3 if(startIndex == endIndex) return 1; // case 1: beginning and the end are the same if(st.charAt(startIndex) == st.charAt(endIndex)) return 2 + lpsLengthRecursive(st, startIndex+1, endIndex-1); // case 2: skip one element either from the beginning or the end int r1 = lpsLengthRecursive(startIndex+1, endIndex); int r2 = lpsLengthRecursive(startIndex, endIndex-1); return Math.max(r1, r2); Run time: ??
  15. Longest Palindromic Subsequence c != d cddpd ddpd cddp c

    != p d == d
 count = 2 dp d != p p d p == p count = 1 d == d count = 1 2 + 1 = 3 if(startIndex == endIndex) return 1; // case 1: beginning and the end are the same if(st.charAt(startIndex) == st.charAt(endIndex)) return 2 + lpsLengthRecursive(st, startIndex+1, endIndex-1); // case 2: skip one element either from the beginning or the end int r1 = lpsLengthRecursive(startIndex+1, endIndex); int r2 = lpsLengthRecursive(startIndex, endIndex-1); return Math.max(r1, r2); Run time: 2 ^ n if(startIndex == endIndex) return 1; // case 1: beginning and the end are the same if(st.charAt(startIndex) == st.charAt(endIndex)) return 2 + lpsLengthRecursive(st, startIndex+1, endIndex-1); // case 2: skip one element either from the beginning or the end int r1 = lpsLengthRecursive(startIndex+1, endIndex); int r2 = lpsLengthRecursive(startIndex, endIndex-1); return Math.max(r1, r2);
  16. Given: cddpd
 Return: 3 (ddd or dpd) Longest Palindromic Subsequence

    1 2 3 4 0 0 1 2 3 4 starting index c d d p d 0 1 2 3 4 ending index
  17. Given: cddpd
 Return: 3 (ddd or dpd) Longest Palindromic Subsequence

    1 2 3 4 0 0 1 2 3 4 starting index ending index c d d p d 0 1 2 3 4 length = 1
  18. Given: cddpd
 Return: 3 (ddd or dpd) Longest Palindromic Subsequence

    1 1 1 1 1 1 2 3 4 0 0 1 2 3 4 starting index ending index c d d p d 0 1 2 3 4 length = 1
  19. Given: cddpd
 Return: 3 (ddd or dpd) Longest Palindromic Subsequence

    1 1 1 1 1 1 2 3 4 0 0 1 2 3 4 starting index ending index c d d p d 0 1 2 3 4 length = 2
  20. Given: cddpd
 Return: 3 (ddd or dpd) Longest Palindromic Subsequence

    1 1 1 1 1 1 2 3 4 0 0 1 2 3 4 starting index ending index c d d p d 0 1 2 3 4 length = 2 what substring is this?
  21. Given: cddpd
 Return: 3 (ddd or dpd) Longest Palindromic Subsequence

    1 1 1 1 1 1 2 3 4 0 0 1 2 3 4 starting index ending index c d d p d 0 1 2 3 4 length = 2 “cd”
  22. Given: cddpd
 Return: 3 (ddd or dpd) Longest Palindromic Subsequence

    1 1 1 1 1 1 1 2 3 4 0 0 1 2 3 4 starting index ending index c d d p d 0 1 2 3 4 length = 2 “cd”
  23. Given: cddpd
 Return: 3 (ddd or dpd) Longest Palindromic Subsequence

    1 1 1 1 1 1 1 2 3 4 0 0 1 2 3 4 starting index ending index c d d p d 0 1 2 3 4 length = 2 “dd”
  24. Given: cddpd
 Return: 3 (ddd or dpd) Longest Palindromic Subsequence

    1 1 1 2 1 1 1 1 2 3 4 0 0 1 2 3 4 starting index ending index c d d p d 0 1 2 3 4 length = 2 “dd”
  25. Given: cddpd
 Return: 3 (ddd or dpd) Longest Palindromic Subsequence

    1 1 1 2 1 1 1 1 1 2 3 4 0 0 1 2 3 4 starting index ending index c d d p d 0 1 2 3 4 length = 2 “dp”
  26. Given: cddpd
 Return: 3 (ddd or dpd) Longest Palindromic Subsequence

    1 1 1 2 1 1 1 1 1 1 2 3 4 0 0 1 2 3 4 starting index ending index c d d p d 0 1 2 3 4 length = 2 “pd”
  27. Given: cddpd
 Return: 3 (ddd or dpd) Longest Palindromic Subsequence

    1 1 1 2 1 1 1 1 1 1 2 3 4 0 0 1 2 3 4 starting index ending index c d d p d 0 1 2 3 4 length = 3
  28. Given: cddpd
 Return: 3 (ddd or dpd) Longest Palindromic Subsequence

    1 1 1 2 1 1 1 1 1 1 2 3 4 0 0 1 2 3 4 starting index ending index c d d p d 0 1 2 3 4 “cdd” max of “cd,” and “dd”
  29. Given: cddpd
 Return: 3 (ddd or dpd) Longest Palindromic Subsequence

    1 1 2 1 2 1 1 1 1 1 1 2 3 4 0 0 1 2 3 4 starting index ending index c d d p d 0 1 2 3 4 “cdd” max of “cd,” and “dd”
  30. Given: cddpd
 Return: 3 (ddd or dpd) Longest Palindromic Subsequence

    1 1 2 1 2 2 1 1 1 1 1 1 2 3 4 0 0 1 2 3 4 starting index ending index c d d p d 0 1 2 3 4 “ddp” max of “dd,” and “dp”
  31. Given: cddpd
 Return: 3 (ddd or dpd) Longest Palindromic Subsequence

    1 1 2 1 2 2 1 1 1 1 1 1 2 3 4 0 0 1 2 3 4 starting index ending index c d d p d 0 1 2 3 4 “dpd” max of “dp,” and “pd”
  32. Given: cddpd
 Return: 3 (ddd or dpd) Longest Palindromic Subsequence

    1 1 2 1 2 2 1 1 1 1 1 1 2 3 4 0 0 1 2 3 4 starting index ending index c d d p d 0 1 2 3 4 “dpd” max of “dp,” and “pd” … 1?!?
  33. Given: cddpd
 Return: 3 (ddd or dpd) Longest Palindromic Subsequence

    1 1 2 1 2 2 1 1 3 1 1 1 1 2 3 4 0 0 1 2 3 4 starting index ending index c d d p d 0 1 2 3 4 “dpd” If start == end, 2 + start[+1]end[-1]
 (“p”)
  34. // create dp[][] array dp[i][i] = 1; // every length

    1 substring for (int startIndex = s.length() - 1; startIndex >= 0; startIndex--) { for (int endIndex = startIndex + 1; endIndex < s.length(); endIndex++) { // case 1: letter at the beginning and the end are the same if (s.charAt(startIndex) == s.charAt(endIndex)) { dp[startIndex][endIndex] = 2 + dp[startIndex + 1][endIndex - 1]; } else { // case 2: skip one element either from the beginning or the end dp[startIndex][endIndex] = Math.max( dp[startIndex + 1][endIndex], dp[startIndex][endIndex - 1]); } } } return dp[0][st.length() - 1];
  35. // create dp[][] array dp[i][i] = 1; // every length

    1 substring for (int startIndex = s.length() - 1; startIndex >= 0; startIndex--) { for (int endIndex = startIndex + 1; endIndex < s.length(); endIndex++) { // case 1: letter at the beginning and the end are the same if (s.charAt(startIndex) == s.charAt(endIndex)) { dp[startIndex][endIndex] = 2 + dp[startIndex + 1][endIndex - 1]; } else { // case 2: skip one element either from the beginning or the end dp[startIndex][endIndex] = Math.max( dp[startIndex + 1][endIndex], dp[startIndex][endIndex - 1]); } } } return dp[0][st.length() - 1]; start end
  36. // create dp[][] array dp[i][i] = 1; // every length

    1 substring for (int startIndex = s.length() - 1; startIndex >= 0; startIndex--) { for (int endIndex = startIndex + 1; endIndex < s.length(); endIndex++) { // case 1: letter at the beginning and the end are the same if (s.charAt(startIndex) == s.charAt(endIndex)) { dp[startIndex][endIndex] = 2 + dp[startIndex + 1][endIndex - 1]; } else { // case 2: skip one element either from the beginning or the end dp[startIndex][endIndex] = Math.max( dp[startIndex + 1][endIndex], dp[startIndex][endIndex - 1]); } } } return dp[0][st.length() - 1]; start end
  37. // create dp[][] array dp[i][i] = 1; // every length

    1 substring for (int startIndex = s.length() - 1; startIndex >= 0; startIndex--) { for (int endIndex = startIndex + 1; endIndex < s.length(); endIndex++) { // case 1: letter at the beginning and the end are the same if (s.charAt(startIndex) == s.charAt(endIndex)) { dp[startIndex][endIndex] = 2 + dp[startIndex + 1][endIndex - 1]; } else { // case 2: skip one element either from the beginning or the end dp[startIndex][endIndex] = Math.max( dp[startIndex + 1][endIndex], dp[startIndex][endIndex - 1]); } } } return dp[0][st.length() - 1]; start end
  38. // create dp[][] array dp[i][i] = 1; // every length

    1 substring for (int startIndex = s.length() - 1; startIndex >= 0; startIndex--) { for (int endIndex = startIndex + 1; endIndex < s.length(); endIndex++) { // case 1: letter at the beginning and the end are the same if (s.charAt(startIndex) == s.charAt(endIndex)) { dp[startIndex][endIndex] = 2 + dp[startIndex + 1][endIndex - 1]; } else { // case 2: skip one element either from the beginning or the end dp[startIndex][endIndex] = Math.max( dp[startIndex + 1][endIndex], dp[startIndex][endIndex - 1]); } } } return dp[0][st.length() - 1]; start end
  39. // create dp[][] array dp[i][i] = 1; // every length

    1 substring for (int startIndex = s.length() - 1; startIndex >= 0; startIndex--) { for (int endIndex = startIndex + 1; endIndex < s.length(); endIndex++) { // case 1: letter at the beginning and the end are the same if (s.charAt(startIndex) == s.charAt(endIndex)) { dp[startIndex][endIndex] = 2 + dp[startIndex + 1][endIndex - 1]; } else { // case 2: skip one element either from the beginning or the end dp[startIndex][endIndex] = Math.max( dp[startIndex + 1][endIndex], dp[startIndex][endIndex - 1]); } } } return dp[0][st.length() - 1]; start end
  40. // create dp[][] array dp[i][i] = 1; // every length

    1 substring for (int startIndex = s.length() - 1; startIndex >= 0; startIndex--) { for (int endIndex = startIndex + 1; endIndex < s.length(); endIndex++) { // case 1: letter at the beginning and the end are the same if (s.charAt(startIndex) == s.charAt(endIndex)) { dp[startIndex][endIndex] = 2 + dp[startIndex + 1][endIndex - 1]; } else { // case 2: skip one element either from the beginning or the end dp[startIndex][endIndex] = Math.max( dp[startIndex + 1][endIndex], dp[startIndex][endIndex - 1]); } } } return dp[0][st.length() - 1]; start end
  41. // create dp[][] array dp[i][i] = 1; // every length

    1 substring for (int startIndex = s.length() - 1; startIndex >= 0; startIndex--) { for (int endIndex = startIndex + 1; endIndex < s.length(); endIndex++) { // case 1: letter at the beginning and the end are the same if (s.charAt(startIndex) == s.charAt(endIndex)) { dp[startIndex][endIndex] = 2 + dp[startIndex + 1][endIndex - 1]; } else { // case 2: skip one element either from the beginning or the end dp[startIndex][endIndex] = Math.max( dp[startIndex + 1][endIndex], dp[startIndex][endIndex - 1]); } } } return dp[0][st.length() - 1];
  42. // create dp[][] array dp[i][i] = 1; // every length

    1 substring for (int startIndex = s.length() - 1; startIndex >= 0; startIndex--) { for (int endIndex = startIndex + 1; endIndex < s.length(); endIndex++) { // case 1: letter at the beginning and the end are the same if (s.charAt(startIndex) == s.charAt(endIndex)) { dp[startIndex][endIndex] = 2 + dp[startIndex + 1][endIndex - 1]; } else { // case 2: skip one element either from the beginning or the end dp[startIndex][endIndex] = Math.max( dp[startIndex + 1][endIndex], dp[startIndex][endIndex - 1]); } } } return dp[0][st.length() - 1];
  43. - Solving it ‘naively’ first helps come up with DP

    approach - Recursive -> bottom up approach - Palindromic questions -> two pointers, one at start and one at end What did we learn?
  44. 2 problems 30 minutes for each problem Pick the person

    that has their birthday coming up next! Mock Interviews
  45. - DP problems are hard, practice is key
 - We

    didn’t cover DP + Binary Trees, would recommend spending some time practicing that - HackerRank - More practice next week! Before next session
  46. Interned at Dreamworks 
 -> realized I didn’t like big

    companies Recruited a bunch senior year, failed a bunch of interviews
  47. Interned at Dreamworks 
 -> realized I didn’t like big

    companies Recruited a bunch senior year, failed a bunch of interviews Got a full time offer at a financial startup (75k) -> wasn’t really excited, but wanted a job
  48. Interned at Dreamworks 
 -> realized I didn’t like big

    companies Recruited a bunch senior year, failed a bunch of interviews Got a full time offer at a financial startup (75k) -> wasn’t really excited, but wanted a job Found an internship at a startup (7k / month)
 Converted to full time after 3 months (90k) -> got a raise after 6 months (100k)
  49. Interned at Dreamworks 
 -> realized I didn’t like big

    companies Recruited a bunch senior year, failed a bunch of interviews Got a full time offer at a financial startup (75k) -> wasn’t really excited, but wanted a job Found an internship at a startup (7k / month)
 Converted to full time after 3 months (90k) -> got a raise after 6 months (100k) One year later… Wanted to feel more challenged at my job -> took a CodePath Android class (8 weeks)
  50. Interned at Dreamworks 
 -> realized I didn’t like big

    companies Recruited a bunch senior year, failed a bunch of interviews Got a full time offer at a financial startup (75k) -> wasn’t really excited, but wanted a job Found an internship at a startup (7k / month)
 Converted to full time after 3 months (90k) -> got a raise after 6 months (100k) One year later… Wanted to feel more challenged at my job -> took a CodePath Android class (8 weeks) Recruited for Android jobs -> failed a bunch
  51. Got two full time offers at two different startups 


    - company A (110k)
 - company B (105k)
 - negotiated a bit: company A -> 110k, company B -> 115k + 15k sign on bonus
  52. Got two full time offers at two different startups 


    - company A (110k)
 - company B (105k)
 - negotiated a bit: company A -> 110k, company B -> 115k + 15k sign on bonus 1.5 years later -> Felt like I wasn’t learning much anymore -> looked for jobs at hardware companies
  53. Got two full time offers at two different startups 


    - company A (110k)
 - company B (105k)
 - negotiated a bit: company A -> 110k, company B -> 115k + 15k sign on bonus 1.5 years later -> Felt like I wasn’t learning much anymore -> looked for jobs at hardware companies 2 years later -> Thought about starting to save more money -> Recruited at big companies