LeeCode_14.最长公共前缀(暴力+LCP+分治+排序)

一、介绍

1.题目描述

题目链接:https://leetcode-cn.com/problems/longest-common-prefix/

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

2.测试样例

["flower","flow","flight"]  # "fl"

["dog","racecar","car"]  # ""

二、题解

1、暴力(纵向扫描)🟢

依次判断每个字符串的第 i 个字符是否相同,直到不相同为止

  • 遍历得到最小的字符长度,防止超限

# 1、新建空字符串,不断加入后返回
class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        int minn=201;
        // 最短的字符有多长
        for(int i=0;i<strs.size();i++){
            if(minn>strs[i].length()) minn=strs[i].length();
        }
        // s 存储已确定的公共前缀
        string s="";
        // 当遍历到字符不一致,返回已确定公共的字符串
        for(int i=0;i<minn;i++){
            char t=strs[0][i];
            for(int j=1;j<strs.size();j++){
                if(strs[j][i]!=t) return s;
            }
            s+=strs[0][i];
        }
        return s;
    }
};

# 2、用substr返回
class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        int minn=201;
        for(int i=0;i<strs.size();i++){
            if(minn>strs[i].length()) minn=strs[i].length();
        }
        for(int i=0;i<minn;i++){
            char t=strs[0][i];
            for(int j=1;j<strs.size();j++){
                if(strs[j][i]!=t) return strs[0].substr(0,i);
            }
        }
        return strs[0].substr(0,minn);
    }
};

1、 

  

2、

2、LCP(LCP(S1,S2),S3)..【横向扫描】🟡

判断第一个字符串s1和第二个字符串s2的公共前缀,作为新字符串 s' 和第三个字符串 s3 计算前缀。

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        string pre=strs[0];
        for(int i=1;i<strs.size();i++){
            string temp="";
            int n=min(pre.length(),strs[i].length());
            for(int j=0;j<n;j++){
                if(pre[j]!=strs[i][j]) break;
                else temp+=pre[j];
            }
            if(temp.length()==0)return "";
            if(temp.length()<pre.length()) pre=temp; 
        }
        return pre;
    }
};

 3、分治法🟡

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if (strs.size() == 0) return "";
        return midpre(strs,0,strs.size()-1);
    }

    // 两个字符串计算公共前缀
    string Prefix(const string& str1,const string& str2) {
        int n=min(str1.length(),str2.length());
        int i=0;
        for(;i<n;i++){
            if(str1[i]!=str2[i]) return str1.substr(0, i);
        }
        return str1.substr(0, n);
    }
    
    // 递归直到只有两个字符串比较
    string midpre(vector<string>& strs,int l,int r){
        int mid=(l+r)/2;
        if(l>=r) return strs[l];
        else{
            string str1=midpre(strs,l,mid);
            string str2=midpre(strs,mid+1,r);
            return Prefix(str1,str2);
        }
    }
};

 4、排序后比较首尾🔴

  • 由于字符大小按ASCⅡ数值排序,相同字符数值相同。
  • 若有公共前缀,比较首尾必能得到
  • 公共前缀长度一定小于首尾长度的最小值
class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if(strs.size()==0)return "";
        sort(strs.begin(),strs.end());
        string st=strs.front(),en=strs.back();
        int n=min(st.size(),en.size());
        for(int i=0;i<n;i++){
            if(st[i]!=en[i])return st.substr(0,i);
        }
        return strs[0];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
try { //获取用户载荷 authorizationToken = authorizationToken.substring(7); //检查redis 只要有就继续 Long remainTime = redisUtils.getExpiredTime(BusinessConstant.JWT_REDIS_KEY.getKey() +authorizationToken, TimeUnit.SECONDS); if (remainTime <= 0) { throw new AuthorizationException(BusinessCode.NOT_AUTHORIZED.getCode(), BusinessCode.JWT_SIGNATURE_EXCEPTION.getMsg()); } //检查签名 JwtPayLoad<UserVo> payLoadFromJwt = JwtUtils.getPayLoadFromJwt(authorizationToken, publicKey, UserVo.class, BusinessConstant.SYSTEM_JWT_PAYLOAD_KEY.getKey()); //redis续期时间 min long now = System.currentTimeMillis(); long jwtExpiredTime = payLoadFromJwt.getExpiredTime().getTime(); long reNewTime = Long.parseLong(BusinessConstant.JWT_RENEW_TIME.getKey()) * 60 * 1000; //判断是否需要续期 if (jwtExpiredTime - now <= reNewTime) { //获取旧的用户属性 UserVo user = payLoadFromJwt.getPayLoadData(); //过期时间 int expiredTime = Integer.parseInt(BusinessConstant.JWT_EXPIRED_TIME.getKey()); String jwtTokenWithExpireTimeMinutes = JwtUtils.createJwtTokenWithExpireTimeMinutes(user, rsaProperties.getPrivateKey(), expiredTime, BusinessConstant.SYSTEM_JWT_PAYLOAD_KEY.getKey(), BusinessConstant.SYSTEM_JWT_ISS.getKey()); redisUtils.setNewAndDeleteOldWithExpiredTime(BusinessConstant.JWT_REDIS_KEY.getKey() + jwtTokenWithExpireTimeMinutes, user.getName() + ":" + user.getUserId(),BusinessConstant.JWT_REDIS_KEY.getKey() +authorizationToken, expiredTime, TimeUnit.MINUTES); response.setHeader(BusinessConstant.JWT_REQUEST_HEAD.getKey(), jwtTokenWithExpireTimeMinutes); log.info("====客户端:" + ipAddr + " 用户:" + user.getName() + " -- (" + user.getUserId() + ") token续期成功!!!!"); }
最新发布
06-05
这段代码是一个 Java 代码块,其中包含了一些逻辑代码。这段代码主要是用于实现用户认证和 JWT Token 的续期功能。下面是对代码块中各行代码的解释: 1. `authorizationToken = authorizationToken.substring(7);`:从请求头中获取 JWT Token,去掉前缀 "Bearer ",并将其赋值给变量 authorizationToken。 2. `Long remainTime = redisUtils.getExpiredTime(BusinessConstant.JWT_REDIS_KEY.getKey() +authorizationToken, TimeUnit.SECONDS);`:从 Redis 中获取 JWT Token 的剩余过期时间,单位为秒,并将其赋值给变量 remainTime。 3. `if (remainTime <= 0) {throw new AuthorizationException(BusinessCode.NOT_AUTHORIZED.getCode(), BusinessCode.JWT_SIGNATURE_EXCEPTION.getMsg());}`:如果 JWT Token 已经过期,则抛出一个自定义异常 AuthorizationException,该异常包含了错误码和错误信息。 4. `JwtPayLoad<UserVo> payLoadFromJwt = JwtUtils.getPayLoadFromJwt(authorizationToken, publicKey, UserVo.class, BusinessConstant.SYSTEM_JWT_PAYLOAD_KEY.getKey());`:使用公钥 publicKey 解析 JWT Token,并获取其中的 Payload 数据,即 JWT Token 中携带的用户信息。 5. `long jwtExpiredTime = payLoadFromJwt.getExpiredTime().getTime();`:从 Payload 中获取 JWT Token 的过期时间,并将其赋值给变量 jwtExpiredTime。 6. `long reNewTime = Long.parseLong(BusinessConstant.JWT_RENEW_TIME.getKey()) * 60 * 1000;`:从配置文件中获取 JWT Token 续期时间,单位为分钟,并将其转换为毫秒,并将其赋值给变量 reNewTime。 7. `if (jwtExpiredTime - now <= reNewTime) {...}`:如果 JWT Token 的过期时间与当前时间的差值小于等于续期时间,则进行续期操作。 8. `UserVo user = payLoadFromJwt.getPayLoadData();`:从 Payload 中获取用户信息,并将其赋值给变量 user。 9. `int expiredTime = Integer.parseInt(BusinessConstant.JWT_EXPIRED_TIME.getKey());`:从配置文件中获取 JWT Token 的过期时间,单位为分钟,并将其转换为整数,并将其赋值给变量 expiredTime。 10. `String jwtTokenWithExpireTimeMinutes = JwtUtils.createJwtTokenWithExpireTimeMinutes(user, rsaProperties.getPrivateKey(), expiredTime, BusinessConstant.SYSTEM_JWT_PAYLOAD_KEY.getKey(), BusinessConstant.SYSTEM_JWT_ISS.getKey());`:使用私钥 rsaProperties.getPrivateKey() 生成新的 JWT Token,并指定其过期时间和 Payload 数据。 11. `redisUtils.setNewAndDeleteOldWithExpiredTime(BusinessConstant.JWT_REDIS_KEY.getKey() + jwtTokenWithExpireTimeMinutes, user.getName() + ":" + user.getUserId(), BusinessConstant.JWT_REDIS_KEY.getKey() + authorizationToken, expiredTime, TimeUnit.MINUTES);`:将新生成的 JWT Token 和 Redis 中旧的 JWT Token 进行替换,并设置过期时间为 expiredTime 分钟。 12. `response.setHeader(BusinessConstant.JWT_REQUEST_HEAD.getKey(), jwtTokenWithExpireTimeMinutes);`:将新生成的 JWT Token 放入响应头中,以便客户端获取。 13. `log.info("====客户端:" + ipAddr + " 用户:" + user.getName() + " -- (" + user.getUserId() + ") token续期成功!!!!");`:记录续期操作的日志信息,包括客户端 IP 地址、用户名称和用户 ID。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值