C/C++每日一练(20230415) 交错字符串、最短回文串、分段函数

简介: C/C++每日一练(20230415) 交错字符串、最短回文串、分段函数

1. 交错字符串

给定三个字符串 s1s2s3,请你帮忙验证 s3 是否是由 s1s2 交错 组成的。

两个字符串 st交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空子字符串

  • s = s1 + s2 + ... + sn
  • t = t1 + t2 + ... + tm
  • |n - m| <= 1
  • 交错s1 + t1 + s2 + t2 + s3 + t3 + ... 或者 t1 + s1 + t2 + s2 + t3 + s3 + ...

提示:a + b 意味着字符串 ab 连接。

示例 1:

输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"

输出:true


示例 2:

输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"

输出:false

示例 3:

输入:s1 = "", s2 = "", s3 = ""

输出:true


提示:

  • 0 <= s1.length, s2.length <= 100
  • 0 <= s3.length <= 200
  • s1s2、和 s3 都由小写英文字母组成

以下程序实现了这一功能,请你填补空白处内容:

```c++
#include 
#include 
#include 
#include 
static bool isInterleave(char *s1, char *s2, char *s3)
{
    int i, j;
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    int len3 = strlen(s3);
    if (len1 + len2 != len3)
    {
        return false;
    }
    bool *table = malloc((len1 + 1) * (len2 + 1) * sizeof(bool));
    bool **dp = malloc((len1 + 1) * sizeof(bool *));
    for (i = 0; i < len1 + 1; i++)
    {
        dp[i] = &table[i * (len2 + 1)];
    }
    dp[0][0] = true;
    for (i = 1; i < len1 + 1; i++)
    {
        dp[i][0] = dp[i - 1][0] && s1[i - 1] == s3[i - 1];
    }
    for (i = 1; i < len2 + 1; i++)
    {
        ____________________;
    }
    for (i = 1; i < len1 + 1; i++)
    {
        for (j = 1; j < len2 + 1; j++)
        {
            bool up = dp[i - 1][j] && s1[i - 1] == s3[i + j - 1];
            bool left = dp[i][j - 1] && s2[j - 1] == s3[i + j - 1];
            dp[i][j] = up || left;
        }
    }
    return dp[len1][len2];
}
int main(int argc, char **argv)
{
    if (argc != 4)
    {
        fprintf(stderr, "Usage: ./test s1 s2 s3\n");
        exit(-1);
    }
    printf("%s\n", isInterleave(argv[1], argv[2], argv[3]) ? "true" : "false");
    return 0;
}
```

出处:

https://edu.csdn.net/practice/25658351

代码:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
static bool isInterleave(char *s1, char *s2, char *s3)
{
    int i, j;
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    int len3 = strlen(s3);
    if (len1 + len2 != len3)
    {
        return false;
    }
    bool *table = (bool*)malloc((len1 + 1) * (len2 + 1) * sizeof(bool));
    bool **dp = (bool**)malloc((len1 + 1) * sizeof(bool *));
    for (i = 0; i < len1 + 1; i++)
    {
        dp[i] = &table[i * (len2 + 1)];
    }
    dp[0][0] = true;
    for (i = 1; i < len1 + 1; i++)
    {
        dp[i][0] = dp[i - 1][0] && s1[i - 1] == s3[i - 1];
    }
    for (i = 1; i < len2 + 1; i++)
    {
    dp[0][i] = dp[0][i - 1] && s2[i - 1] == s3[i - 1];
    }
    for (i = 1; i < len1 + 1; i++)
    {
        for (j = 1; j < len2 + 1; j++)
        {
            bool up = dp[i - 1][j] && s1[i - 1] == s3[i + j - 1];
            bool left = dp[i][j - 1] && s2[j - 1] == s3[i + j - 1];
            dp[i][j] = up || left;
        }
    }
    return dp[len1][len2];
}
int main()
{
  char *s1 = (char*)"aabcc";
  char *s2 = (char*)"dbbca";
  char *s3 = (char*)"aadbbcbcac";
  printf(isInterleave(s1,s2,s3) ? "true" : "false");
  return 0;
}

输出:

true


2. 最短回文串

给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。

示例 1:

输入:s = "aacecaaa"

输出:"aaacecaaa"


示例 2:

输入:s = "abcd"

输出:"dcbabcd"


提示:

  • 0 <= s.length <= 5 * 10^4
  • s 仅由小写英文字母组成

出处:

https://edu.csdn.net/practice/25658352

代码:

#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
    string shortestPalindrome(string s)
    {
        string rev(s);
        reverse(rev.begin(), rev.end());
        string combine = s + "#" + rev;
        vector<int> lps(combine.length(), 0);
        int remove = getLPS(combine, lps);
        string prepend = rev.substr(0, rev.length() - remove);
        return prepend + s;
    }
    int getLPS(string s, vector<int> &lps)
    {
        int j = 0, i = 1;
        while (i < s.length())
        {
            if (s[i] == s[j])
            {
                lps[i] = j + 1;
                i++;
                j++;
            }
            else
            {
                if (j != 0)
                {
                    j = lps[j - 1];
                }
                else
                {
                    lps[i] = 0;
                    i++;
                }
            }
        }
        return lps[lps.size() - 1];
    }
};
int main()
{
  Solution s;
  cout << s.shortestPalindrome("aacecaaa") << endl;
  cout << s.shortestPalindrome("abcd") << endl;
  return 0;
}

输出:

aaacecaaa

dcbabcd


3. 分段函数计算

编程输入实数x,计算下面函数的值,并输出y的值,并输出y的值;

x^2      x<1

x-1      1≦x≦10

x/5      x>10

出处:

https://edu.csdn.net/practice/25658353

代码:

# include<stdio.h>
# include<stdlib.h>
int main(void)
{
    float x,y;
    printf("请输入x的值:\n");
    scanf("%f",&x);
    if(x<1)
    {
        y = x * x;
    }
    else if(x<=10)
    {
        y=3*x-1;
    }
    else
    {
        y= x / 5;
    }
    printf("y的值为:%f\n",y);
    system("pause");
    return 0;
}

输出:


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力!

🌟 收藏,你的青睐是我努力的方向!

评论,你的意见是我进步的财富!  

主页:https://hannyang.blog.csdn.net/


目录
相关文章
|
2月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
2月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
88 6
|
2月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
46 0
|
2月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
39 3
|
2月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
404 1
|
2月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
51 1
|
2月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
70 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
2月前
|
缓存 网络协议 API
C/C++ StringToAddress(字符串转 boost::asio::ip::address)
通过上述步骤和示例代码,你可以轻松地在C++项目中实现从字符串到 `boost::asio::ip::address`的转换,从而充分利用Boost.Asio库进行网络编程。
89 0
|
2月前
|
编译器 C语言 C++
C/C++数字与字符串互相转换
C/C++数字与字符串互相转换
|
1月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
51 2