每日一题 | 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(字符串反转 | 公共子串计算)的主要内容,如果未能解决你的问题,请参考以下文章