题目
题解
读题!读题!读题!读懂题意才能程序怎吗写。不是傻逼一样看一遍题目,看一遍例题就开始写程序。
这道题的题目指出,现有个一个字符串s和一个字典数组。要在这个字典数组中匹配出与该字符串s相似度最高的一个。但是字典中的字符串不是啥字符串都行,必须是字符串s的子串,啥是子串,题目给出的,该字符串可以通过删除 s 中的某些字符得到。明确规定,子串的长度不能超过字符串s的长度且不能包含字符串s中意外的字符,当两个子串拥有字符数量一样的时候就要字典序最小的那个。何为字典序,可以简单理解为字符的ASCLL码,看谁的ASCLL码小就选择谁。
双指针+循环
/*** @param {string} s* @param {string[]} dictionary* @return {string}* 条件一: 该字符串可以通过删除 s 中的某些字符得到* 解释: 也就是说dictionary中的字符串必须是s的子串, 是字符串s经过删除部分字符 得到的* 条件2: 返回长度最长且字典序最小的字符串* 解释 返回子串中长度最长的,当子串中长度一致时,看谁的ASCLL小*/var findLongestWord = function(s, dictionary) {let prevLen = 0;let word = ''// 先把符合条件的子串筛选出来for(let value of dictionary) {let curValueLen = value.length;if(childWord(s, value)){if(curValueLen > prevLen) {prevLen = curValueLen;word = value} else if (curValueLen == prevLen) {if(value < word) word = value;}}}return word;};/*** 查找子串* 当d中的字符没有出现在s中的字符说明不是它的字串*/function childWord (s, d) {let sLen = s.length;let dLen = d.length;let l = 0;let r = 0;while(r < dLen && l < sLen) {if(s[l] == d[r]) {r++;}l++;}return r == dLen}
优化后的代码
/*** @param {string} s* @param {string[]} dictionary* @return {string}* 条件一: 该字符串可以通过删除 s 中的某些字符得到* 解释: 也就是说dictionary中的字符串必须是s的子串, 是字符串s经过删除部分字符 得到的* 条件2: 返回长度最长且字典序最小的字符串* 解释 返回子串中长度最长的,当子串中长度一致时,看谁的ASCLL小*/var findLongestWord = function(s, dictionary) {let prevLen = 0;let word = ''// 先把符合条件的子串筛选出来for(let value of dictionary) {let curValueLen = value.length;if(childWord(s, value)){if(curValueLen > prevLen || (curValueLen == prevLen && value < word)) {prevLen = curValueLen;word = value}}}return word;};/*** 查找子串* 当d中的字符没有出现在s中的字符说明不是它的字串*/function childWord (s, d) {let sLen = s.length;let dLen = d.length;let l = 0;let r = 0;while(r < dLen && l < sLen) {if(s[l] == d[r]) {r++;}l++;}return r == dLen}
再次优化
/*** @param {string} s* @param {string[]} dictionary* @return {string}* 条件一: 该字符串可以通过删除 s 中的某些字符得到* 解释: 也就是说dictionary中的字符串必须是s的子串, 是字符串s经过删除部分字符 得到的* 条件2: 返回长度最长且字典序最小的字符串* 解释 返回子串中长度最长的,当子串中长度一致时,看谁的ASCLL小*/var findLongestWord = function(s, dictionary) {let prevLen = 0;let word = ''// 先把符合条件的子串筛选出来for(let value of dictionary) {let curValueLen = value.length;if(childWord(s, value)){if(curValueLen > prevLen || (curValueLen == prevLen && value < word)) {prevLen = curValueLen;word = value}}}return word;};/*** 查找子串* 当d中的字符没有出现在s中的字符说明不是它的字串*/function childWord (s, d) {let sLen = s.length;let dLen = d.length;if(sLen < dLen) return falselet l = 0;let r = 0;while(r < dLen && l < sLen) {if(s[l] == d[r]) r++;l++;}return r == dLen;}
双指针+排序
/*** @param {string} s* @param {string[]} dictionary* @return {string}* 条件一: 该字符串可以通过删除 s 中的某些字符得到* 解释: 也就是说dictionary中的字符串必须是s的子串, 是字符串s经过删除部分字符 得到的* 条件2: 返回长度最长且字典序最小的字符串* 解释 返回子串中长度最长的,当子串中长度一致时,看谁的ASCLL小*/var findLongestWord = function(s, dictionary) {dictionary.sort()dictionary.sort((a,b) => b.length - a.length);for(value of dictionary) {if(childWord(s, value)) {return value}}return ''};/*** 判断是否为子串*/function childWord (s, d) {let sLen = s.length;let dLen = d.length;let l = 0;let r = 0;while(r < dLen && l < sLen) {if(s[l] == d[r]) {r++;}l++;}return r == dLen}
