leetcode|面试题 01.04. 回文排列[字符串、集合、回文]

题目描述

在这里插入图片描述

考察知识

字符串、回文、集合

解题思路

  • 首先明确考察的是回文串,回文串指的是正反两个方向都一样的单词或短语。
  • 由于题目中给出回文串中的字符不一定是字典中的字母,因此不考虑使用位运算进行化简
  • 回文串的排列,因此不需要考虑顺序,所以决定使用set集合来解决问题,这样解决会优于使用map哈希表
  • 回文串的排列中如果串的长度是奇数,那么一定会有一个字符出现了奇数次,其余的出现偶数次,相反如果长度是偶数,那么所有的字符出现次数都是偶数次,具体见代码及注释

解题代码

class Solution {
    
    
public:
    bool canPermutePalindrome(string s) {
    
    
        // 由于只需要记录出现的奇数和偶数次两种状态,可以集合中的有无来标识
        set<char> recoder;
        set<char>::iterator iter;
        // 遍历字符串
        for (int i = 0; i < s.length(); i++) {
    
    
            iter = recoder.find(s[i]);
            //集合中有此字符,删除
            if (iter != recoder.end()) {
    
    
                recoder.erase(s[i]);
            }
            // 集合中没有本字符,填入
            else {
    
    
                recoder.emplace(s[i]);
            }
        }
        if (s.length() % 2 == 0) {
    
    // 长度为偶数
            return recoder.empty();
        }
        else {
    
    // 长度为奇数
            if (recoder.size() == 1) {
    
    
                return true;
            }
            else
            {
    
    
                return false;
            }
        }
    }
};

知识沉淀

  1. 回文串:正反两个方向都一样的单词或短语。
  2. 当需要使用无序的数据结构,并且每一个key只需要考虑两种状态时,考虑使用集合(set)

Guess you like

Origin blog.csdn.net/qq_43528044/article/details/121795951
Recommended