题目

image.png

题解

读题!读题!读题!读懂题意才能程序怎吗写。不是傻逼一样看一遍题目,看一遍例题就开始写程序。
这道题的题目指出,现有个一个字符串s和一个字典数组。要在这个字典数组中匹配出与该字符串s相似度最高的一个。但是字典中的字符串不是啥字符串都行,必须是字符串s的子串,啥是子串,题目给出的,该字符串可以通过删除 s 中的某些字符得到。明确规定,子串的长度不能超过字符串s的长度且不能包含字符串s中意外的字符,当两个子串拥有字符数量一样的时候就要字典序最小的那个。何为字典序,可以简单理解为字符的ASCLL码,看谁的ASCLL码小就选择谁。

双指针+循环

  1. /**
  2. * @param {string} s
  3. * @param {string[]} dictionary
  4. * @return {string}
  5. * 条件一: 该字符串可以通过删除 s 中的某些字符得到
  6. * 解释: 也就是说dictionary中的字符串必须是s的子串, 是字符串s经过删除部分字符 得到的
  7. * 条件2: 返回长度最长且字典序最小的字符串
  8. * 解释 返回子串中长度最长的,当子串中长度一致时,看谁的ASCLL小
  9. */
  10. var findLongestWord = function(s, dictionary) {
  11. let prevLen = 0;
  12. let word = ''
  13. // 先把符合条件的子串筛选出来
  14. for(let value of dictionary) {
  15. let curValueLen = value.length;
  16. if(childWord(s, value)){
  17. if(curValueLen > prevLen) {
  18. prevLen = curValueLen;
  19. word = value
  20. } else if (curValueLen == prevLen) {
  21. if(value < word) word = value;
  22. }
  23. }
  24. }
  25. return word;
  26. };
  27. /**
  28. * 查找子串
  29. * 当d中的字符没有出现在s中的字符说明不是它的字串
  30. */
  31. function childWord (s, d) {
  32. let sLen = s.length;
  33. let dLen = d.length;
  34. let l = 0;
  35. let r = 0;
  36. while(r < dLen && l < sLen) {
  37. if(s[l] == d[r]) {
  38. r++;
  39. }
  40. l++;
  41. }
  42. return r == dLen
  43. }

优化后的代码

  1. /**
  2. * @param {string} s
  3. * @param {string[]} dictionary
  4. * @return {string}
  5. * 条件一: 该字符串可以通过删除 s 中的某些字符得到
  6. * 解释: 也就是说dictionary中的字符串必须是s的子串, 是字符串s经过删除部分字符 得到的
  7. * 条件2: 返回长度最长且字典序最小的字符串
  8. * 解释 返回子串中长度最长的,当子串中长度一致时,看谁的ASCLL小
  9. */
  10. var findLongestWord = function(s, dictionary) {
  11. let prevLen = 0;
  12. let word = ''
  13. // 先把符合条件的子串筛选出来
  14. for(let value of dictionary) {
  15. let curValueLen = value.length;
  16. if(childWord(s, value)){
  17. if(curValueLen > prevLen || (curValueLen == prevLen && value < word)) {
  18. prevLen = curValueLen;
  19. word = value
  20. }
  21. }
  22. }
  23. return word;
  24. };
  25. /**
  26. * 查找子串
  27. * 当d中的字符没有出现在s中的字符说明不是它的字串
  28. */
  29. function childWord (s, d) {
  30. let sLen = s.length;
  31. let dLen = d.length;
  32. let l = 0;
  33. let r = 0;
  34. while(r < dLen && l < sLen) {
  35. if(s[l] == d[r]) {
  36. r++;
  37. }
  38. l++;
  39. }
  40. return r == dLen
  41. }

再次优化

  1. /**
  2. * @param {string} s
  3. * @param {string[]} dictionary
  4. * @return {string}
  5. * 条件一: 该字符串可以通过删除 s 中的某些字符得到
  6. * 解释: 也就是说dictionary中的字符串必须是s的子串, 是字符串s经过删除部分字符 得到的
  7. * 条件2: 返回长度最长且字典序最小的字符串
  8. * 解释 返回子串中长度最长的,当子串中长度一致时,看谁的ASCLL小
  9. */
  10. var findLongestWord = function(s, dictionary) {
  11. let prevLen = 0;
  12. let word = ''
  13. // 先把符合条件的子串筛选出来
  14. for(let value of dictionary) {
  15. let curValueLen = value.length;
  16. if(childWord(s, value)){
  17. if(curValueLen > prevLen || (curValueLen == prevLen && value < word)) {
  18. prevLen = curValueLen;
  19. word = value
  20. }
  21. }
  22. }
  23. return word;
  24. };
  25. /**
  26. * 查找子串
  27. * 当d中的字符没有出现在s中的字符说明不是它的字串
  28. */
  29. function childWord (s, d) {
  30. let sLen = s.length;
  31. let dLen = d.length;
  32. if(sLen < dLen) return false
  33. let l = 0;
  34. let r = 0;
  35. while(r < dLen && l < sLen) {
  36. if(s[l] == d[r]) r++;
  37. l++;
  38. }
  39. return r == dLen;
  40. }

双指针+排序

  1. /**
  2. * @param {string} s
  3. * @param {string[]} dictionary
  4. * @return {string}
  5. * 条件一: 该字符串可以通过删除 s 中的某些字符得到
  6. * 解释: 也就是说dictionary中的字符串必须是s的子串, 是字符串s经过删除部分字符 得到的
  7. * 条件2: 返回长度最长且字典序最小的字符串
  8. * 解释 返回子串中长度最长的,当子串中长度一致时,看谁的ASCLL小
  9. */
  10. var findLongestWord = function(s, dictionary) {
  11. dictionary.sort()
  12. dictionary.sort((a,b) => b.length - a.length);
  13. for(value of dictionary) {
  14. if(childWord(s, value)) {
  15. return value
  16. }
  17. }
  18. return ''
  19. };
  20. /**
  21. * 判断是否为子串
  22. */
  23. function childWord (s, d) {
  24. let sLen = s.length;
  25. let dLen = d.length;
  26. let l = 0;
  27. let r = 0;
  28. while(r < dLen && l < sLen) {
  29. if(s[l] == d[r]) {
  30. r++;
  31. }
  32. l++;
  33. }
  34. return r == dLen
  35. }