每日一题 | day20(字符串反转 | 公共子串计算)

Posted WhiteShirtI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题 | day20(字符串反转 | 公共子串计算)相关的知识,希望对你有一定的参考价值。

选择题

1、若栈采用顺序存储方式存储,现两栈共享空间V[1…m],top[i]代表第i个栈( i =1,2)栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是( )。
A top[1]+top[2]=m
B top[1]+1=top[2]
C top[2]-top[1]|=0
D top[1]=top[2]

正确答案 B:
在这里插入图片描述
2、某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( )
A 不存在这样的二叉树
B 200
C 198
D 199

正确答案 A:根据二叉树的基本性质,对任何一棵二叉树,度为 0 的结点(即叶子结点)总是比度为 2 的结点多一个----公式:n0 =n2+1。题目中度为 2 的结点为 199 个,则叶子结点为199+1=200

编程题

题目1
在这里插入图片描述
题解思路:非常简单,定义两个指针,一个指向字符串的头,一个指向字符串的尾,交换头和尾的数据,然后头指针向后走,尾指针向前走,继续交换

代码

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

void strReverse(string& str)
{
    int start = 0;
    int end = str.size() - 1;
    while (start < end)
    {
        char tmp = str[start];
        str[start] = str[end];
        str[end] = tmp;
        
        start++;
        end--;
    }
}

int main()
{
    string str;
    while (cin >> str)
    {
        strReverse(str);
        cout << str << endl;
    }
}

题目2
在这里插入图片描述
题解思路:动态规划,我们可以建立一个二维数组,如下
在这里插入图片描述
这是一个具有6行12列的二维数组,行数是由字符串1的长度来确定的,列数是由字符串2的长度来确定的。一开始我们将该表都初始化为0,然后遍历表格,只要字符相等,就表示遇到相同的字符,就将该位置的值置为前对角线的值加1,表示该字符串时连续且是公共字符串。处于0行或者0列的值需要特殊处理,如果相同就将该位置置为1即可
在这里插入图片描述
代码

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

int getMaxComSubstr(const string& str1, const string& str2)
{
    int len1 = str1.size();
    int len2 = str2.size();
    vector<vector<int>> msc(len1, vector<int>(len2, 0));//len1行len2列
    
    int max_len = 0;
    for (int i = 0; i < len1; ++i)
    {
        for (int j = 0; j < len2; ++j)
        {
            if (str2[j] == str1[i])
            {
                if (i >= 1 && j >= 1)
                    msc[i][j] = msc[i - 1][j - 1] +1;
                else
                    msc[i][j] = 1;
                
                if (msc[i][j] > max_len)//获取最大长度
                    max_len = msc[i][j];
            }
        }
    }
    return max_len;
}

int main()
{
    string str1, str2;
    while (cin >> str1 >> str2)
    {
        int max_len = getMaxComSubstr(str1, str2);
        cout << max_len << endl;
    }
    return 0;
}

代码2

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int getCommonStrLength(string& str1, string& str2)
{
    if (str2.size() > str1.size())
        swap(str1, str2);
    int sz1 = str1.size();
    int sz2 = str2.size();
    for (int i = sz2 ; i > 0; --i)//子串长度
    {
        for (int j = 0; j <= sz2 - i; ++j)
        {
            string str3 = str2.substr(j, i); //获取字符串
            if (str1.find(str3) != string::npos)//存在则找到
            return str3.size();
        }
    }
    return 0;
}

int main()
{
    string str1, str2;
    while (cin >> str1 >> str2)
    {
        cout << getCommonStrLength(str1, str2);
    }
    return 0;
}

以上是关于每日一题 | day20(字符串反转 | 公共子串计算)的主要内容,如果未能解决你的问题,请参考以下文章

每日一题 错选择 及 编程题 周总结

力扣每日一题——反转每对括号之间的子串

力扣每日一题——反转每对括号之间的子串

力扣每日一题——反转每对括号之间的子串

力扣每日一题——反转每对括号之间的子串

每日一题查找两个字符串中的最长公共子串