LetCode刷题[简单题](3)检测最长公共字符串(排序的妙用)

解决的问题是字符串最小的公共部分。

class Solution {

public:

    string longestCommonPrefix(vector<string>& strs) {

    if (strs.empty()) {

        return "";  //如果是空字符串

    }



    // 对字符串数组按字典序排序

    std::sort(strs.begin(), strs.end());



    std::string prefix = "";

    int minLength = std::min(strs[0].length(), strs.back().length()); //最小的字符串长度,两端的字符串



    // 比较排序后的第一个字符串和最后一个字符串

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

        if (strs[0][i] == strs.back()[i]) {

            prefix += strs[0][i];

        } else {

            break;

        }

    }



    return prefix;



    }

};

问题转化技巧,字符串的公共头部的检测。

1. 朴素的逻辑理解方式是,直接暴力匹配比较所有的字符串知道有不同的部分
2. 功能重合思路转化,在C++中有一些相似功能实际已经做了相同字符串的排序,比如sort(),分类字符串的时候相同的公共部分已经做过排序判断排序,将相同的字符串聚集在一堆并且有着先后顺序的一堆,此时最不相似的字符串肯定已经分离开了,分离开的相似性最小的字符串就是两边的字符串,只需要针对两边的字符串进行判断公共部分就可以,最不像的字符串具有前缀的一票否决权,到否定的地方就可以得到所有前缀。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值