leetcode 97:交错字符串

2024-09-02 15:18
文章标签 leetcode 字符串 交错 97

本文主要是介绍leetcode 97:交错字符串,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

看到该题的第一个想法就是直接使用三个指针,t1表示当前s1的下标  t2表示当前s2的下标  t3表示s3的下标

不过因为可能s1 和s2当前的下标纸箱的值都和s3当前的下标指向的字符相同,所以使用数组存放t1 t2 t3的值

bool isInterleave(std::string s1,std::string s2,std::string s3){int t1=0;int t2=0;int t3=0;int n1=s1.size();int n2=s2.size();int n3=s3.size();std::vector<int> ss1;std::vector<int> ss2;std::vector<int> ss3;if(n1+n2!=n3)return false;while(t3<n3){if(s3[t3]==s2[t2]&&s3[t3]==s1[t1]){t3++;t1++;ss1.push_back(t1-1);ss2.push_back(t2);ss3.push_back(t3-1);}else if(s3[t3]==s1[t1]&&s3[t3]!=s2[t2]) {t3++;t1++;}else if(s3[t3]==s2[t2]&&s3[t3]!=s1[t1]){t3++;t2++;}else if(s3[t3]!=s2[t2]&&s3[t3]!=s1[t1]){if(ss1.size()!=0){t3=ss3.back();t2=ss2.back();t1=ss1.back();ss2.pop_back();ss1.pop_back();ss3.pop_back();t3++;t2++;}elsereturn false;}}return true;
}

不过这种方式时间复杂度比较高

第二种方式 ,一般字符串的题都可以使用动态规划  使用动态规划的方式

bool isInterleave(std::string s1,std::string s2,std::string s3){int n1=s1.size();int n2=s2.size();int n3=s3.size();if(n1+n2!=n3)return false;if(n1==0&&n2!=0){for(int i=0;i<s2.size();i++){if(s2[i]!=s3[i])return false;}return true;}else if(n1!=0&&n2==0){for(int i=0;i<s1.size();i++){if(s1[i]!=s3[i])return false;}return true;}else if(n1==0&&n2==0)return true;std::vector<std::vector<int>> ss;std::vector<int> a(n2+1);for(int i=0;i<n1+1;i++){ss.push_back(a);}for(int i=1;i<n1+1;i++){if(s1[i-1]==s3[i-1])ss[i][0]=1;elsebreak;}for(int j=1;j<n2+1;j++){if(s2[j-1]==s3[j-1])ss[0][j]=1;elsebreak;}int i=1;int j=1;for(;i<n1+1;i++){for(j=1;j<n2+1;j++){if(ss[i][j-1]==1&&s3[i+j-1]==s2[j-1])ss[i][j]=1;else if(ss[i-1][j]==1&&s3[i+j-1]==s1[i-1])ss[i][j]=1;else if(ss[i-1][j-1]==1){if(s3[i+j-2]==s1[i-1]&&s3[i+j-1]==s2[j-1])ss[i][j]=1;else if(s3[i+j-2]==s2[j-1]&&s3[i+j-1]==s1[i-1])ss[i][j]=1;}}}return ss[i-1][j-1];
}

 

这篇关于leetcode 97:交错字符串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1130315

相关文章

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数