【每日编程-365期】兰州大学上机题(一)

教育   2024-11-24 10:02   广西  

兰州大学上机题(一)


每日编程中遇到任何疑问、意见、建议请公众号留言或加入每日编程群聊739635399

【每日编程合集】1-360



输入个字符串,例如asdfghj,然后又给了个字符串,sdfg要求将输入字符串中的sdfg删除,就是相当于删除子字符串。

输入格式:

输入两个字符串,之间以空格隔开

输出格式:

删除子串后的字符串

输入样例:

asdfghj sdfg

输出样例:

ahj

解决方法:

(1)算法的基本思想:

先找到子字符串,然后再进行删除操作,这里根据所学的数据结构存在两种方法,笔者先采用暴力法解决,KMP算法以注释给出。

(2)代码实现:

#include <iostream>
#include <string.h>
using namespace std;
//暴力搜索
int BF(char str[], char substr[])
{
    //确定每个字符串的长度
    int m = strlen(str);
    int n = strlen(substr);
    int i = 0, j = 0;
    while (i < m && j < n)
    {
        if (str[i] == substr[j])
        { //若相等,则继续比较后序字符
            i++;
            j++;
        }
        else
        { //指针回退,重新匹配
            i = i - j + 1;
            j = 0;
        }
    }
    if (j >= n)
        return i - n;
    else
        return 0;
}
int length(char arr[], int pos, int pos1)
{
    int slength = strlen(arr);
    for (int i = pos1; i < slength; i++)
        arr[pos++] = arr[i];
    return pos;
}
//KMP算法求解
void getNext(char T[], int next[], int n)
{
    int i = 1;
    next[0] = 0//不存储任何数据
    next[1] = 0;
    int j = 0;
    while (i <= n)
    { //n表示字符串T的长度
        if (j == 0 || T[i - 1] == T[j - 1])
        {
            i++;
            j++;
            next[i] = j;
        }
        else
            j = next[j];
    }
}
//KMP--求子串在主串中第pos个字符之后的位置的KMP算法
int KMP(char S[], char T[], int next[], int pos)
{
    int i = pos;
    int j = 1;
    while (i <= strlen(S) && j <= strlen(T))
    {
        if (j == 0 || S[i - 1] == T[j - 1])
        {
            ++i;
            ++j;
        }
        else
            j = next[j];
    }
    if (j > strlen(T))
        return i - strlen(T) - 1;
    else
        return 0;
}
int main()
{
    cout << "输入两个字符串:" << endl;
    //假设两个字符串的最大长度均为100
    char str[100], substr[100];
    cin >> str >> substr;
    /*
    KMP算法
    int next[100];
    getNext(substr, next, strlen(substr));
    int pos = KMP(str, substr, next, 0);
    */

    int pos = BF(str, substr);
    int pos1 = pos + strlen(substr);
    int lengthStr = length(str, pos, pos1);
    for (int i = 0; i < lengthStr; i++)
        cout << str[i];
    system("pause");
    return 0;
}

明日预告:兰州大学上机题(二)
字符串压缩,比如xxxxxdddfff,输出x5d3f3

输入格式:

输入一个仅含字母的字符串

输出格式:

输出压缩后的字符串

输入样例:

xxxxxdddfff

输出样例:

x5d3f3


灰灰考研
最全的【计算机考研】【软件考研】考研信息! 最丰富的共享资料! 最大程度上帮助学渣狗登上研究生大门!
 最新文章