首页 > 试题广场 >

查找字符串中的最长公共前缀

[编程题]查找字符串中的最长公共前缀
  • 热度指数:867 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
编写查询函数返回数字字符串中最大的公共前缀字符串


输入描述:
flower flow  flight 
 一组包含公共前缀的数组字符串


输出描述:
fl
字符串中最长公共前缀 

示例1

输入

flower,flow,flight

输出

fl

说明

fi为数组中最长公共前缀字符串
var arr = readline().split(',');
var min = arr[0].length;
for (var i = 1; i < arr.length; i++) {
    if (min > arr[i].length) min = arr[i].length
}
console.log(dfs(arr))

function dfs(arr) {
    var map = new Map();
    var res = '';
    for (var i = 0; i < min; i++) {
        for (var j = 0; j < arr.length; j++) {
            if (j == 0) {
                map.set(arr[j][i], null)
            } else if (map.has(arr[j][i])) {
                if (j == arr.length - 1) res += arr[j][i]
                continue;
            } else {
                return res
            }
        }
    }
    return res
}
发表于 2022-02-25 21:17:09 回复(0)
function maxStr(arr) {
    return arr.reduce((res, item) => {
      let temp = ''

      for (let i = 0; i < res.length; i++) {
        if (res[i] === item[i]) {
          temp += res[i]
        } else {
          break
        }
      }
      return temp
    })
  }
  console.log(maxStr(['flow', 'flower', 'flight']))
发表于 2022-03-02 21:14:02 回复(0)
// **原题 14-最长公共前缀
// 思路:竖着看相不相等咯

const strArr = readline().split(',');
let min = strArr[0].length;
let len = 0;
for (let i = 1; i < strArr.length; i++) {
  min = Math.min(min, strArr[i].length);
}

function calLen() {
  for (let i = 0; i < min; i++) {
    for (let j = 1; j < strArr.length; j++) {
      // 相等的传递性
      if (strArr[j][i] !== strArr[j - 1][i]) {
        return len;
      }
    }
    len++;
  }
  return len;
}
// 切一下字符串
console.log(strArr[0].slice(0, calLen()));

编辑于 2022-08-02 11:01:45 回复(0)
let line = readline().split(","),len = line.length,res = line[0],commonstr; 
for(let i = 1; i < len;i++) {    
 if(line[0].length == 0) {    
     break; 
  }    
   commonstr = commonstring(res,line[i]); 
}
console.log(commonstr);
function commonstring(s1,s2) {  
   let index = 0,minlen = Math.min(s1.length,s2.length);    
   while(index < minlen && s1[index] == s2[index]) {      
    index++;    
   }   
   let commonstr = s1.substring(0,index);    
   return commonstr;
}
编辑于 2022-04-01 09:32:41 回复(1)
let str = readline().split(',');
let num = str.length;

//求出各个字符串的最小长度
let minLen = 99999999;
str.forEach((element)=>{
    let curLen = element.length
    if(curLen < minLen ){
        minLen = curLen;
    }
})

//设最大前缀字符串长度为0
let prefixNum=0;
let flag=true;
for(let i=0;i< minLen && flag;i++){
    //检查所有字符串的第i个字符是否都相同
    let curStr=str[0][i]
    for(let j=0;j<num;j++){
        if(str[j][i]!==curStr){
            //已找到存在不相同的第i个字符,不用在往下找了
            flag=false;
            break;
        }
    }
    //所有字符串的第i个字符都相同
    if(flag){
        prefixNum=i;
    }
}
//输出
console.log(str[0].slice(0,prefixNum+1))
发表于 2022-03-30 14:01:36 回复(0)
//JavaScript V8
const strs = readline().split(",")
if(!strs) console.log(""); //如果输入为空,自然返回空字符串
let res = strs[0];
//新建一个求两个字符串最长公共前缀的函数
const getLongestCommonPrefix = (str1, str2) => {
    let minLen = Math.min(str1.length, str2.length);
    let commonIndex = 0;
    while(commonIndex < minLen && str1[commonIndex] === str2[commonIndex]){
        commonIndex++;
    }
    return str1.slice(0, commonIndex);
}
for(let i = 1; i < strs.length; i++){
    //使用上面新建的函数横向扫描
    res = getLongestCommonPrefix(res, strs[i]);
    //如果还没扫描完,res已经为空,就可以直接返回。为了减少用时,不加也可以。
    if(!res.length) console.log(res);
}
console.log(res);

发表于 2022-03-12 06:38:57 回复(0)
var arr = readline().split(',');
var LongestPrefix = function(str) {
	var data = str.split(",");
    var res;
	for(let i = 0; i < data[0].length; i++) {
		res = data[0].slice(0, i + 1);
		for(let k = 0; k < data.length; k++) {
			if(data[k].slice(0, i + 1) !== res)
				return data[0].slice(0, i);
			}
		}
		return res;
	}
console.log(LongestPrefix(arr[0]));

发表于 2022-02-25 22:35:03 回复(0)
// 将字符串转换为数组,然后记录数组中的第一个字符串的每一个字符,依次判断数组总每个字符串是否都有这个字符,使用every,若返回false,则改字符串不是公共前缀字符串,则不再判断。
let commontFirstStr = function() {
    let arr = readline().split(",");
    if(arr.length) {
        let commont = ''; // 记录公共前缀
        for(let i = 0; i < arr[0].length; i++){
            let temp = arr[0][i]; // 记录第一个字符串的每一个字符
            // 判断数组中的每个字符串是否有对应相同的字符
            if(arr.every(el=>{
                return el.charAt(i) == temp;
            })){
                commont += temp; // 若相同及记录下相同的字符
            } else {
                break; // 反之,不是相同的前缀字符,停止判断
            }
        }
        return commont;
    }
    return '';

}

console.log(commontFirstStr());

发表于 2022-03-18 16:47:14 回复(0)
推荐使用every方法 
let arr = readline().split(',');
let res = '';
for(let i = 0;i<arr[0].length;i++){
    let cur = arr[0].charAt(i);
    let flag = arr.every((val) => {
        return val.charAt(i) === cur 
    })
    if (flag){
        res += cur
    }
}
console.log(res)
发表于 2022-10-21 00:54:41 回复(0)
# 查找字符串中的最长公共前缀

def Solution(arr):
    inArr= arr
    for i in range(len(inArr[0])):
        for j in range(len(inArr)):
            if(inArr[j][i]!=inArr[0][i]):
                break
        else:
            # return inArr[0][:j]
            print(inArr[0][:j])
            return
    # return ''
    print('')
    return

str = input()
arr = str.split(',')
Solution(arr)

发表于 2022-09-03 00:22:32 回复(0)
var longestCommonPrefix = function (strs) {
    if (strs == null || strs.length == 0)
        return "";
    //默认第一个字符串是他们的公共前缀
    let prefix = strs[0];
    let i = 1;
    while (i < strs.length) {
        //不断的截取
        while (strs[i].indexOf(prefix) != 0) {
            prefix = prefix.substring(0, prefix.length - 1);
        }
        i++;
    }
    return prefix;
};

发表于 2022-03-26 23:33:59 回复(0)
let line = readline()
let arr = line.split(/\s+/)
let res = ""
for(let i = 0;i < arr[0].length;i++){
    let c = arr[0][i]
    if(arr.every(item => item[i] === c)){
        res = res + c
    }else{
        break
    }
}
 console.log(res)
这用的什么测试用例啊,为什么我这个代码无法通过。
发表于 2022-03-24 12:11:18 回复(1)
const inputStr = readline();
const arr = inputStr.split(',');
// 再不传入默认值的情况下,prev指向的是index=0位置,item指向index=1位置
print(arr.reduce((prev,item)=>{
    let temp = '';
    for(let i =0;i<prev.length;i++){
        if(prev[i] === item[i]){
               temp += prev[i];
        }else{
            break;
        }
    }
    return temp;
}));
感谢上面老哥提示!
发表于 2022-03-08 22:26:03 回复(0)
function commonPrefix(stringArray) {

if (!stringArray.length) {
return ''
}

let first = stringArray[0]
let prefix = ''

for (let i = 0; i < first.length; i++) {
for (let j = 1; j < stringArray.length; j++) {
if (first[i] != stringArray[j][i]) {
return prefix
}
}
prefix += first[i]
}
return prefix
}

console.log(commonPrefix(["flower", "flow", "flight"]))
发表于 2022-02-23 16:08:53 回复(3)