鱼C论坛

 找回密码
 立即注册
查看: 3546|回复: 66

[已解决]Python:每日一题 381

[复制链接]
发表于 2020-4-20 17:44:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天的题目:


给定两个字符串 s 和 t,判断是否有可能删除 t 的若干个字符(也可以不删除)使得 s == t 。

注意:不能移动字符的位置。

示例 1:

输入:s = "133", t = "1133"
输出:True
示例 2:

输入:s = "abcde", t = "abcde"
输出:True
示例 3:

输入:s = "131", t = "1133"
输出:False
示例 4:

输入:s = "abc", t = "ahbgdc"
输出:True
示例 5:

输入:s = "axc", t = "ahbgdc"
输出:False


欢迎大家一起答题!
最佳答案
2020-4-20 18:20:13
本帖最后由 塔利班 于 2020-4-20 18:26 编辑
  1. def f381(s,t):
  2.     a=len(t)-len(s)
  3.     index=0
  4.     for i in range(len(s)):
  5.         while 1:
  6.             if a-index+i<0:
  7.                 return False
  8.             if s[i]==t[index]:
  9.                 index+=1
  10.                 break
  11.             index+=1
  12.     return True
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-20 17:48:24 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-4-20 17:55 编辑

利用迭代器实现的双指针
  1. class Solution:
  2.     def isSubsequence(self, s: str, t: str) -> bool:
  3.         try:
  4.             s=s.__iter__()
  5.             last=s.__next__()

  6.             for i in t:
  7.                 if i==last:
  8.                     last=s.__next__()

  9.             return False
  10.         
  11.         except StopIteration:
  12.             return True
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 17:58:27 | 显示全部楼层
在力扣上发现一个很 NICE 的解法:
  1. class Solution(object):
  2.     def isSubsequence(self, s, t):
  3.         t = iter(t)
  4.         return all(c in t for c in s)
复制代码
原文在这
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 18:01:25 | 显示全部楼层
本帖最后由 kinkon 于 2020-4-22 14:33 编辑

双针不费空间
  1. def f381(s, t):
  2.     r1, r2 = len(s), len(t)
  3.     i = j = 0
  4.     while i < r1 and j < r2:
  5.         if t[j] != s[i]:
  6.             j += 1
  7.         elif s[i] == t[j]:
  8.             i, j = i + 1, j + 1
  9.         else:
  10.             i += 1
  11.     return i == r1 and j <= r2
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5 119 ms

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 18:16:43 | 显示全部楼层
本帖最后由 March2615 于 2020-4-20 18:53 编辑
  1. def daily381(s: str, t: str) -> bool:
  2.     # 解题思路:-> s是不是t的子序列
  3.     # len(t) >= len(s)
  4.     # 双指针,pt遍历t,ps遍历s,若pt==ps,ps+=1,same+=1
  5.     if len(t) < len(s):
  6.         return False
  7.     pt, ps, same = 0, 0, 0
  8.     while pt < len(t) and ps < len(s):
  9.         if s[ps] == t[pt]:
  10.             ps += 1
  11.             same += 1
  12.         pt += 1
  13.     return same == len(s)
复制代码


想到昨天用find也很方便
  1. def daily381(s: str, t: str) -> bool:
  2.     l = -1  # find 找不到返回值为-1
  3.     # m = 0
  4.     for each in s:
  5.         # l = t[m + l + 1:].find(each)
  6.         # m = l
  7.         l = t.find(each, l + 1)
  8.         if l == -1:
  9.             return False
  10.     return True
复制代码

这里如果用切片,需要另一个量去记录,比较麻烦,可以直接用find实现

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 18:20:13 | 显示全部楼层    本楼为最佳答案   
本帖最后由 塔利班 于 2020-4-20 18:26 编辑
  1. def f381(s,t):
  2.     a=len(t)-len(s)
  3.     index=0
  4.     for i in range(len(s)):
  5.         while 1:
  6.             if a-index+i<0:
  7.                 return False
  8.             if s[i]==t[index]:
  9.                 index+=1
  10.                 break
  11.             index+=1
  12.     return True
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2020-4-20 19:01:00 | 显示全部楼层

子序列必须按照顺序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 19:03:45 | 显示全部楼层
March2615 发表于 2020-4-20 18:16
想到昨天用find也很方便

这里如果用切片,需要另一个量去记录,比较麻烦,可以直接用find实现

果然 C 写的就是牛逼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 19:23:26 | 显示全部楼层

是按顺序的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 19:23:28 | 显示全部楼层
  1. const static auto _=[](){
  2.     ios::sync_with_stdio(false);
  3.     cin.tie(nullptr);
  4.     cout.tie(nullptr);
  5.     return NULL;
  6. }();


  7. class Solution {
  8. public:
  9.     bool isSubsequence(string s, string t) {
  10.         int j=0;
  11.         for(auto i:t){
  12.             if(i==s[j]){
  13.                 j++;
  14.             }
  15.         }
  16.         return j==s.size();
  17.     }
  18. };
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 19:24:14 | 显示全部楼层

Counter 不存在顺序这一说
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 19:33:16 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-4-20 19:24
Counter 不存在顺序这一说

试出来了,是自动化问题,重复字符会按第一个排序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 19:40:10 | 显示全部楼层
本帖最后由 liuzhengyuan 于 2020-4-20 20:03 编辑

(第一次来做题,有可能会错)
(这是一个很不错的方法)
  1. def m381(s, t):
  2.     i=0
  3.     j=0
  4.     judge=0
  5.     for i in range(len(s)):
  6.         for j in range(len(t)):
  7.             if s[i] == t[j]:
  8.                 t = t[j:]
  9.                 judge+=1
  10.                 break
  11.     if judge == len(s):
  12.         return True
  13.     else:
  14.         return False
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 19:49:14 | 显示全部楼层

我是用python写的啊,我不会C
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 19:55:03 | 显示全部楼层
  1. import re

  2. def func381(s,t):
  3.     slen=len(s)
  4.     tlen=len(t)
  5.     if slen >tlen:
  6.         return False
  7.     for index in range(slen):
  8.         flag=re.search(s[index],t,re.I|re.M)
  9.         if flag ==None:
  10.             return False
  11.         
  12.         newstart=flag.span()[1]
  13.         t=t[newstart:]
  14.         if index==slen-1:
  15.             return True

  16. if __name__=='__main__':
  17.     s=input("请输入一个待检测字符串:")
  18.     t=input("请输入被检测字符串:")
  19.     result=func381(s,t)
  20.     print(result)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 20:03:13 | 显示全部楼层
March2615 发表于 2020-4-20 19:49
我是用python写的啊,我不会C

我是说那个find……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 20:23:33 | 显示全部楼层

  1. def f381(s,t):
  2.     m,n,ls=0,len(t),''
  3.     for i in s:
  4.         while m<n:
  5.           if i==t[m]:
  6.               ls+=i
  7.               break
  8.           else:
  9.               m+=1
  10.     return True if ls==s else False
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 20:35:05 | 显示全部楼层
本帖最后由 TJBEST 于 2020-4-21 17:47 编辑

来个笨办法,可能超时
  1. def fun381(s,t):
  2.     if len(s) > len(t):
  3.         return False
  4.     try:
  5.         start = t.index(s[0])
  6.     except:
  7.         return False
  8.     try:
  9.         temp = t[::-1]
  10.         end = len(t) - (temp.index(s[-1])+1)
  11.     except:
  12.         return False
  13.     t = t[start:(end+1)]
  14.     if len(s) > len(t):
  15.         return False
  16.     M = len(s)
  17.     N = len(t)
  18.     Count = [0 for i in range(0,N)]
  19.     for i in range(0,M):
  20.         try:
  21.             temp = t.index(s[i])
  22.         except:
  23.             return False
  24.         for j in range(temp,N):
  25.             Count[j] += 1
  26.     temp = -1
  27.     for i in range(0,M):
  28.         tempChar = s[i]
  29.         while True:
  30.             try:
  31.                 temp = t.index(tempChar,temp + 1)
  32.             except:
  33.                 return False
  34.             if Count[temp] > i:
  35.                 break
  36.     return True
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 21:04:54 | 显示全部楼层
  1. def fun381(s,t):
  2.     if set(s)&set(t)!=set(s):return False
  3.     if s==t:return True
  4.     a,b=[],0
  5.     for i in s:
  6.         a.append(t.find(i)+b)
  7.         b+=t.find(i)+1
  8.         t=t[t.find(i)+1:]
  9.     if len(a)==len(set(a)):return True
  10.     else:return False
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 21:52:32 | 显示全部楼层
本帖最后由 zltzlt 于 2020-4-21 17:54 编辑
  1. s = "abc"
  2. t = "ahbgdc"
  3. def fun381(s, t):
  4.     if s == t:
  5.         return True
  6.     elif len(t) <= len(s):
  7.         return False
  8.     else:
  9.         i = 0
  10.         while len(t) > len(s):
  11.             if t[i] == s[i]:
  12.                 i += 1
  13.                 continue
  14.             else:
  15.                 if i == 1:
  16.                     t = t[0] +t[(i+1):]
  17.                 else:
  18.                     t = t[:i] + t[(i+1):]
  19.         if t == s:
  20.             return True
  21.         else:
  22.             return False
  23. print(fun381(s, t))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 16:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表