lc0315

✅ 1332. 删除回文子序列

https://leetcode-cn.com/problems/remove-palindromic-subsequences/

描述

给你一个字符串 s,它仅由字母 'a' 和 'b' 组成。每一次删除操作都可以从 s 中删除一个回文 子序列 tt3

返回删除给定字符串中所有字符(字符串为空)的最小删除次数。

「子序列」定义:如果一个字符串可以通过删除原字符串某些字符而不改变原字符顺序得到,那么这个字符串就是原字符串的一个子序列。
tt: 原来 这句话的意思是: 比如: ababaaaabababaab ,那么我可以其实删除了所有的a,因为所有的a可以构成: 一个回文 子序列 tt3
「回文」定义:如果一个字符串向后和向前读是一致的,那么这个字符串就是一个回文。

 

示例 1:

输入:s = "ababa"
输出:1
解释:字符串本身就是回文序列,只需要删除一次。
示例 2:

输入:s = "abb"
输出:2
解释:"abb" -> "bb" -> "". 
先删除回文子序列 "a",然后再删除 "bb"。
示例 3:

输入:s = "baabb"
输出:2
解释:"baabb" -> "b" -> "". 
先删除回文子序列 "baab",然后再删除 "b"。
示例 4:

输入:s = ""
输出:0
 

提示:

0 <= s.length <= 1000
s 仅包含字母 'a'  和 'b'

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-palindromic-subsequences
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

检查是否回文的框架是:

 for(int i=0;i<n/2;i++)
            if(s[i]!=s[n-1-i])# key!!
                flag=true;

解答

框架应该是: loop: 找回文,删了,count += 1

示例误导人,原来就是先删除a,再删除b就行了

heuwstheuwst
2 个月前
他怎么会被标记为简单?

c

//确实比较坑,由于是子序列所以只有0,1,2三种情况了。字符串为空则返回0,不是回文串则先把所有的a删除再删除b返回2,是回文串一次删除即可
class Solution {
public:
    int removePalindromeSub(string s) {
        int n=s.length();
        if(n==0)
            return 0;
        bool flag=false;
        for(int i=0;i<n/2;i++)
            if(s[i]!=s[n-1-i])
                flag=true;
        if(flag) return 2;return 1;
    }
};

py

class Solution:
    def removePalindromeSub(self, s: str) -> int:
        if (len(s) == 0):
            return 0
        flag = False 
        for i in range(0, (len(s) // 2)):#tt 这里要必须用range,不能: for i in len(s)
            if (s[i] != s[len(s) - 1 - i]):
                flag = True # tt means: not 回文
        if flag:
            return 2# means: not 回文 del 'a' then del 'b', this is two
        else: 
            return 1# means: we can 立刻, 一次就 del 回文
'''
执行用时 :
36 ms
, 在所有 Python3 提交中击败了
42.83%
的用户
内存消耗 :
13.5 MB
, 在所有 Python3 提交中击败了
100.00%
的用户
'''

✅ 884. 两句话中的不常见单词

https://leetcode-cn.com/problems/uncommon-words-from-two-sentences/

描述

给定两个句子 A 和 B 。 (句子是一串由空格分隔的单词。每个单词仅由小写字母组成。)

如果一个单词在其中一个句子中只出现一次,在另一个句子中却没有出现,那么这个单词就是不常见的。

返回所有不常用单词的列表。

您可以按任何顺序返回列表。

 

示例 1:

输入:A = "this apple is sweet", B = "this apple is sour"
输出:["sweet","sour"]
示例 2:

输入:A = "apple apple", B = "banana"
输出:["banana"]
 

提示:

0 <= A.length <= 200
0 <= B.length <= 200
A 和 B 都只包含空格和小写字母。


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/uncommon-words-from-two-sentences
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答

o(n) 的做法,可能是: 遍历 A, 然后,把每个A 里面的单独的单词,加入集合C。
然后,遍历B, 找到B 中,没有在C 中出现的 words 即可。

他人: 是不是可以理解成拼接字符串A+B,然后返回拼接后的字符串中只出现过一次的单词;谢谢思路

c

C++用map

class Solution {
public:
    vector<string> uncommonFromSentences(string A, string B) {
        map<string, int> hashMap;
        string s = A + " " + B;
        vector<string> res;
        for(int i = 0; i < s.size(); ++i)
        {
            string ret;
            while(i < s.size() && s[i] != ' ')
            {
                ret += s[i];
                ++i;
            }
            
            res.push_back(ret);
        }
        
        for(auto e : res)
        {
            ++hashMap[e];
        }
        res.clear();
        auto it = hashMap.begin();
        while(it != hashMap.end())
        {
            if(it->second == 1)
                res.push_back(it->first);
            ++it;
        }
        
        return res;
    }
};

py

class Solution:
    def uncommonFromSentences(self, A: str, B: str) -> List[str]:
        c = A.split(' ') + B.split(' ')
        return [word for word in c if c.count(word) == 1]
'''
执行用时 :
52 ms
, 在所有 Python3 提交中击败了
13.90%
的用户
内存消耗 :
13.5 MB
, 在所有 Python3 提交中击败了
5.71%
的用户
'''
原文地址:https://www.cnblogs.com/paulkg12/p/12496938.html