2015年北理复试上机

1、有3个字母a,b,c,输入一个数字,要求输出所有的组合字符和组合数

输入:1    输出:a,b,c   3

输入:2    输出:aa,ab,ac,ba,bb,bc,ca,cb,cc    9

每个位置都是独立的,输入的数字其实是规定了位数n,组合数就是3^n。

将位数向前拱转化为两个vector互相倒,每一次都将一个vector的串取出加上abc之后倒到另一个vector里面。

vector clear():清空vector中的元素

#include<iostream>
#include<string>
#include<vector>
#include<cmath>
using namespace std;

int main()
{
    int n;
    cin >> n;
    string a[3] = { "a","b","c" };
    vector<string> v1;
    vector<string> v2;
    v1.push_back(a[0]); v1.push_back(a[1]); v1.push_back(a[2]);
    for (int i = 1; i < n; i++)
    {
        if (i % 2 == 1)//v1->v2
        {
            v2.clear();
            for (int j = 0; j < v1.size(); j++)
            {
                for (int k = 0; k < 3; k++)
                {
                    string s = v1[j];
                    s += a[k];
                    v2.push_back(s);
                }
            }
        }
        else
        {
            v1.clear();
            for (int j = 0; j < v2.size(); j++)
            {
                for (int k = 0; k < 3; k++)
                {
                    string s = v2[j];
                    s += a[k];
                    v1.push_back(s);
                }
            }
        }
    }
    if (n % 2 == 0)
    {
        for (int j = 0; j < v2.size(); j++)cout << v2[j] << " ";
        cout << pow(3, n) << endl;
    }
    else
    {
        for (int j = 0; j < v1.size(); j++)cout << v1[j] << " ";
        cout << pow(3, n) << endl;
    }
    return 0;
}

2、求字符串1与字符串2的最大公共子串的长度及此长度最大公共子串的个数。

输入:abcdefg Eebcdfg (最大公共子串:bcd)    输出:3 1 

输入:abcdefg abcddefg (最大公共子串为:abcd defg)  输出:4 2

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1005;
char s1[N];
char s2[N];
int dp[N][N];

int main()
{
    cin >> s1 >> s2;
    int l1 = strlen(s1);
    int l2 = strlen(s2);
    int ans = 0;
    int num = 0;
    memset(dp, 0, sizeof(dp));
    for (int i = 1; i <= l1; i++)
    {
        for (int j = 1; j <= l2; j++)
        {
            if (s1[i - 1] == s2[j - 1])
            {
                dp[i][j] = dp[i - 1][j - 1] + 1;
                if (dp[i][j] > ans)
                {
                    num = 1;
                    ans = dp[i][j];
                }
                else if (dp[i][j] == ans)num++;
            }
        }
    }
    cout << ans << " " << num << endl;
    return 0;
}

 

posted @ 2019-08-19 17:43  郭怡柔  阅读(275)  评论(0)    收藏  举报