最长公共前缀 C语言

19e4a8fe81154b4a97b10656bb1d6339.png

 ⒈横向扫描

①将第1个字符串作为公共前缀

②第2个与第1个比较,公共部分作为前缀

③第3个与新公共前缀比较,以此类推,遍历数组,得出最后公共部分

⒉纵向扫描

遍历所有字符串的每一列,比较相同列上的字符串是否相同,相同则对下一列比较,不同则输出该列前的字符串

86eaeb46997643a0b544f431ccb8aad1.jpg

 横向扫描法 源码

#include<stdio.h>

#include<string.h>

int comparePrefix(const char *str1, const char *str2) {

 int minLength = strlen(str1) < strlen(str2) ? strlen(str1) : strlen(str2);

 for (int i = 0; i < minLength; ++i) {

 if (str1[i] != str2[i]) {

 return i; 

 } 

  }

 return minLength; 

}

char* estCommonPrefix(char**strs, int strssize) {

    if (strssize == 0) {

  return "";

}

 char *prefix =strs[0];

 int prefixlength=strlen(prefix);

 for(int i=1;i<strssize;i++){

  prefixlength = comparePrefix(prefix, strs[i]);

  if (prefixlength == 0) { 

  return "";

 }

 prefix[prefixlength] = '\0';

}

 return prefix;

}

 

int main(){

 char*strs[3];

 int n=3,i;

 for(i=0;i<n;i++){

  scanf("%s",&*strs[i]);

 }

 int strssize = sizeof(strs) / sizeof(strs[0]);

 char *prefix = estCommonPrefix(strs, strssize);

 printf("%s", prefix);

 return 0;

}

纵向扫描法源码

#include<stdio.h>

#include<string.h>

char* estCommonPrefix(char**strs, int strssize) {

    if (strssize == 0) {

  return "";

}

    char *prefix = strs[0];

 int prefixlength = strlen(prefix);

 for (int i = 1; i < strssize; ++i) {

 char *others=strs[i];

 int otherslength = strlen(others);

 if (otherslength< prefixlength) {

 prefixlength =otherslength;

}

 for (int j = 0; j < prefixlength; ++j) {

 if (prefix[j] != others[j]) {

 prefixlength = j;

 break;

 }

}

 if (prefixlength == 0) {

 return "";

 }

 prefix[prefixlength] = '\0';

}

 

 return prefix;

 

}

int main(){

 char*strs[3];

 int n=3,i;

 for(i=0;i<n;i++){

  scanf("%s",&*strs[i]);

 }

 int strssize = sizeof(strs) / sizeof(strs[0]);

 char *prefix = estCommonPrefix(strs, strssize);

 printf("%s", prefix);

 return 0;

}

家人们觉得有用的话 觉得点赞 评论+关注

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值