京东2018校园招聘笔试-查找相似字符串-算法岗

题目描述:

这里写图片描述

思路解析:

如果s长度小于t的长度,直接打印0
将s串拆分为与t串长度相等的串,如ababcb拆分为aba,bab,abc,bcb,将拆分的串与t作比较,是否相似
比较两串是否相似,如,比较aba与xyx,用数字代替字符,相同字符用相同的数字代替,aba变为121,xyx变为121,二者相同,说明相似。
abc变为123,xyx为121,所以二者不相等

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int solve(string t1, string t)
{
    vector<int>vt1;
    vector<int>vt;
    int it1=1;
    int it = 1;
    int len = t.length();
    vt1.push_back(it1);
    for (int i = 1; i < len; i++)
    {
        for (int j = 0; j < i; j++)             //比较该位上的字符与前面的是否重复
        {
            if (t1[i] == t1[j])
            {
                vt1.push_back(vt1[j]);          //有重复,填入前面出现的数字
                break;
            }
        }
        if (vt1.size()<i+1)                     //没有重复,填入新的数字
            vt1.push_back(++it1);
    }

    vt.push_back(it);
    for (int i = 1; i < len; i++)
    {
        for (int j = 0; j < i; j++)
        {
            if (t[i] == t[j])
            {
                vt.push_back(vt[j]);
                break;
            }
        }
        if (vt.size()<i + 1)
            vt.push_back(++it);
    }

    for (int m = 0; m < len; m++)               //比较转化的数字序列是否相等,有一位不相等,返回0,相等返回1
    {
        if (vt1[m] != vt[m])
            return 0;
    }
    return 1;
}

int main()
{
    string s, t;
    cin >> s;
    cin >> t;
    int count=0;
    int lens = s.length();
    int lent = t.length();
    if (lens < lent)
    {
        cout << count;
        return 0;
    }

    for (int i = 0; i <=lens - lent; i++)
    {
        string t1 = "";
        for (int j = i; j < i + lent; j++)      //从s中取出长度与t相等的串t1
            t1 = t1 + s[j];
//      cout << "t1:" << t1 <<"  " <<"t:" << t<<endl;
        if (solve(t1, t))
        {
            count++;                            //count计数,表示有几个相似的串
//          cout << "count" << count<<endl;
        }
    }
    cout << count;
    return count;
}

猜你喜欢

转载自blog.csdn.net/happyjacob/article/details/82591627