天天看點

leetcode1704. 判斷字元串的兩半是否相似

給你一個偶數長度的字元串​

​s​

​​,将其拆分成長度相同的兩半,前一半為​

​a​

​​,後一半為​

​b​

​​。

兩個字元串相似的前提是它們都含有相同數目的元音(​​

​'a'​

​​, ​

​'e'​

​​, ​

​'i'​

​​, ​

​'o'​

​​, ​

​'u'​

​​, ​

​'A'​

​​, ​

​'E'​

​​, ​

​'I'​

​​, ​

​'O'​

​​, ​

​'U'​

​)。

注意:​

​s​

​可能同時含有大寫和小寫字母。

如果​

​a​

​​和​

​b​

​​相似,傳回​

​true​

​​,否則,傳回​

​false​

​。

示例:

 輸入:s = “book”

 輸出:true

思路:

該題的就是讓我們周遊字元串,判斷字元串的前半段和後半段是否具有相同數目的元音字母,該題目主要考察兩點:

  • 周遊字元串。
  • 哈希表的使用。
  1. 将元音字母存儲到unordered_set容器當中。
  2. 周遊字元串的前半部分,統計元音字母的個數。
  3. 周遊字元串的後半部分,與前半部分的元音字母個數進行抵消。
  4. 若最終count被抵消為0,則說明該字元串前半段和後半段具有相同數目的元音字母。
class Solution {
public:
  bool halvesAreAlike(string s) {
    //1、将元音字母存儲到unordered_set容器中
    string str = "aeiouAEIOU";
    unordered_set<char> us(str.begin(), str.end());
    int count = 0;
    //2、周遊字元串的前半部分,統計元音字母個數
    for (size_t i = 0; i < s.size() / 2; i++)
    {
      if (us.find(s[i]) != us.end())
        count++;
    }
    //3、周遊字元串的後半部分,與前半部分的元音字母個數進行抵消
    for (size_t i = s.size() / 2; i < s.size(); i++)
    {
      if (us.find(s[i]) != us.end())
        count--;
    }
    //4、若最終count被抵消為0,則說明該字元串前半段和後半段具有相同數目的元音字母
    return count == 0;
  }
};