题目:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""
。
虽然领扣把这个题标记成简单,但是我看了好多次以后才有了思路...... 因为要求的是公共前缀,所以必须数组的每项都要包含这个"前缀",所以比较数组中每个元素,取出大家都有的部分是最终目的,逻辑上最然简单,但是javaScript没有直接的方法. 想了很久之后,想到用之前求最大值的方法,随意取出数组中的一个元素(因为是公共前缀,所以谁都一样),用这个元素依次和数组中其他每一个元素的每一个字符做比较,每有一个字符满足题意时,就用一个新的字符串去接收,最后返回这个新字符串即可
1 function getLongest(arr) { 2 //假设第一项为最短项,用来与其他对比 3 var short = arr[0]; 4 var newStr = ''; 5 //先判断数组长度为0和不存在内容等不满足题意的情况 6 if (arr.length == 0) { 7 return ''; 8 } else if (short == '') { 9 return ''; 10 } else { 11 //外循环以short为比较对象,遍历short的每一个字符 12 for (var i = 0; i < short.length; i++) { 13 //内循环遍历数组中除第一项以外的其他项,依次与short做比较 14 for (var j = 0; j < arr.length; j++) { 15 //用short的每一个字符与数组中其他元素的每一个字符做比较,当不相等时,返回当前newStr 16 if (short[i] != arr[j][i]) { 17 return newStr; 18 } 19 } 20 //依次比较short的每个字符,每次执行完之后,更新newStr 21 newStr = short.slice(0, i + 1); 22 } 23 return newStr; 24 } 25 }
当时在两个循环嵌套的时候,卡了比较久的时间,后来才想到用截取字符串的方法动态改变字符串的办法.
第二种方法虽然和这个类似,但是代码更简洁,知识不是很容易想到,对我而言..... 我是在第一种方法的基础上,慢慢归结出第二个方法 这个办法也是用循环和截取字符串结合的方法,但是在截取字符串的时候是从后向前截取,这样最开始拿到的就是"可能的最长公共前缀",每次循环减少字符串的长度,直到满足题意. 这样做有一个好处是在都不匹配的时候会直接返回空字符串(字符串所有内容都被截取掉)
1 function getLongest(arr) { 2 //假设第一项为最短项,用来与其他对比 3 // var short = arr[0]; 4 var i = 1; 5 if (arr.length == 0 || arr == null) return ""; 6 //遍历数组 7 while (i < arr.length) { 8 //用数组中第一项去依次和数组中其他项匹配,匹配成功索引值会为0 9 while (arr[i].indexOf(short) != 0) { 10 //当匹配不到时,从后向前裁剪字符串,假如一直不匹配,最后会裁剪到只有一个空字符串,正好满足题意 11 short = short.substring(0, short.length - 1); 12 } 13 //如果有匹配,就i自增,遍历数组的下一项 14 i++; 15 } 16 return short; 17 }
写完都觉得这题不算简单....