题目:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""

  

  虽然领扣把这个题标记成简单,但是我看了好多次以后才有了思路...... 因为要求的是公共前缀,所以必须数组的每项都要包含这个"前缀",所以比较数组中每个元素,取出大家都有的部分是最终目的,逻辑上最然简单,但是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 }

 

  写完都觉得这题不算简单....

 

posted on 2018-09-11 15:06  会搔耳朵的猫  阅读(162)  评论(0编辑  收藏  举报