题解 | #小美的字符串匹配度#

小美的字符串匹配度

http://www.nowcoder.com/questionTerminal/78190fa0401b4a52a55b99cb8567d4d5

看我的,看我的,时间复杂度是O(n)。详细解释放在代码中,欢迎交流。

#include <iostream>
using namespace std;
#include <array>
#include <unordered_set>
#include <set>

int main() {
    int n;
    string s;
    string t;
    scanf("%d",&n);
    cin>>s;
    cin>>t;

    int res = 0;
    int w = 0; //权重w的范围[0,2]
    array<int,26> f_s={0}; //统计字符出现的频率
    array<int,26> f_t={0};
    set<pair<char,char>> us;
    for(int i=0;i<n;++i){
        if(s[i] == t[i]){
            ++res;
        }
        else{ //仅不匹配的参与统计
            f_s[s[i]-'a']++;
            f_t[t[i]-'a']++;
            us.emplace(s[i],t[i]);
            if(us.find({t[i],s[i]})!=us.end()){//看看前面是否出现了t[i],s[i]如果,出现了刚好和现在的这一对交换,则增加2匹配度
                w=2;
            }
        }
    }
    for(int i=0;i<26;++i){
       if(f_s[i]>0&&f_t[i]>0){ //如果二者同时都存在相同的字符,那说明是可以让两者的匹配度加1的
            w=max(w,1); //取max的原因是,存在可以成对交换的字符
            break;
       }
    }

    res+=w; //加上权重,记为最终答案
    cout << res <<endl;
    return 0;
}


全部评论

相关推荐

尊尼获获:闺蜜在哪?
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-24 20:55
阿里国际 Java工程师 2.7k*16.0
程序员猪皮:没有超过3k的,不太好选。春招再看看
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务