(数组)字符串的回文构词法( anagrams)

  • 题目:https://www.nowcoder.com/practice/e84e273b31e74427b2a977cbfe60eaf4?tpId=46&tqId=29130&tPage=3&rp=3&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking
  • 思路:
    •   首先简单介绍一下Anagram(回文构词法)。Anagrams是指由颠倒字母顺序组成的单词,比如“dormitory”颠倒字母顺序会变成“dirty room”,“tea”会变成“eat”。回文构词法有一个特点:单词里的字母的种类和数目没有改变,只是改变了字母的排列顺序。

      For example:

      Input:  ["tea","and","ate","eat","den"]

      Output:   ["tea","ate","eat"]

    •   这里的思路比较简单:主要的方法就是利用哈希表来进行存储(将字符串作为索引,字符串的下标作为实值)。对给出的字符串数组一一进行遍历,每次单独的处理一个字符串:
      • 这里有个技巧:可以将每个字符串都按字符大小排序,这样方便查找
      • 如果该字符串不在哈希表中,就将他存储哈希表(字符串的值作为索引,下标作为实值)
      • 如果找到一样的字符串,将该字符串存入res中:并且将与该字符串对应的那个匹配的anagrams字符串也存入res中,给定一个标志不再重复的将她存入res中。
  • 代码
    class Solution {
    public:
        vector<string> anagrams(vector<string> &strs) {
            string str;
            map<string, int> map1;
            vector<string> res;
            for (int i=0; i<strs.size(); i++){
                //将每一个字符串单独进行处理,将他们按字符大小进行排序,然后去哈希表中进行排序,然后去哈希表中 匹配是否存在
                //相同的字符,如果找到就将他放入到vector中
                str = strs[i];
                sort(str.begin(), str.end());
                if (map1.find(str) == map1.end()){//找到哈希表的结尾也没找到,用该字符串作为哈希表的键,value为下标值
                    map1[str] = i;
                }
                else{
                    //将第一次出现的anagrams设置一个哈希值,当下一个anagrams出现的时候将第一次出现的那个字符串进入res中
                    //并且将他的哈希值置为-1,以后不再进入res
                    if (map1[str] >= 0){
                        res.push_back(strs[map1[str]]);
                        map1[str] = -1;
                    }
                    //找到相同的   将他放入res
                    res.push_back(strs[i]);
                }
            }
            return res;
        }
    };
时间: 2024-10-25 07:40:13

(数组)字符串的回文构词法( anagrams)的相关文章

leetCode 49.Anagrams (回文构词法) 解题思路和方法

Anagrams Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be in lower-case. 思路:这题要是解,必须知道什么是回文构词法.所谓回文构词法就是把一个单词的顺序调整,形成新的单词,如"eat","tea"就是回文构词法. 所以回文构词法一定是相同的字母不同的顺序,而且最少有两个单词. 本题是将单词排序之

Leetcode:Anagrams 回文构词法

戳我去解题 Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be in lower-case. Anagram(回文构词法)是指打乱字母顺序从而得到新的单词 回文构词法有一个特点:单词里的字母的种类和数目没有改变,只是改变了字母的排列顺序.因此,将几个单词按照字母顺序排序后,若它们相等,则它们属于同一组anagrams class Solution {

UVa 401 Palindromes(字符串,回文)

 Palindromes  A regular palindrome is a string of numbers or letters that is the same forward as backward. For example, the string "ABCDEDCBA" is a palindrome because it is the same when the string is read from left to right as when the string i

UVA - 11584 划分字符串的回文串子串; 简单dp

/** 链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34398 UVA - 11584 划分字符串的回文串子串: 简单dp 题目大意: 给一个字符串, 要求把它分割成若干个子串,使得每个子串都是回文串.问最少可以分割成多少个. 定义:dp[i]表示前0~i内的字符串划分成的最小回文串个数: dp[i] = min(dp[j]+1 | j+1~i是回文串); 先预处理flag[i][j]表示以i~j内的字符串为回文串

(三)、利用命令行参数输入多个参数,判断该数组是否为回文数组

1 /* 2 利用命令行参数输入多个参数,并赋值给一数组,同时判断该数组是否为回文数组 3 –PS:例如数组{“123”,”222”,”333”,”222”,”123”}就是回文数组,即元素倒置过后与原元素一样 4 */ 5 package com.gen; 6 public class ArgumentHuiwen { 7 public static void main(String args[]) 8 { 9 int num[]=new int[100]; 10 int len=args.l

【c语言】判断一个字符串是不是回文字符串

//判断一个字符串是不是回文字符串 #include <stdio.h> #include <assert.h> int panduan( char *p ) { char *q ; assert( *p != NULL ); q = p; while( *p != '\0') { p++; } p--; while(*q != '\0') { if( *p == *q) { p--; q++; } else return -1; } return 1; } int main()

字符串-判断回文

编程判断一个字符串是否是回文,当字符串是回文时,输出字符串:yes!,否则输出字符串:no!.所谓回文即正向与反的拼向写都一样,如adgda. 长度在100以内,且全为小写字母样例输入:adgda样例输出:yes! 代码如下: 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 5 int main() 6 { 7 char s[100]; 8 cin >> s; 9 int n = s

字符串的回文子序列个数

题目描述 求一个长度不超过15的字符串的回文子序列个数(子序列长度>=1). 输入描述 输入一个长度不超过15的字符串,字符串均由小写字母表示 输出描述 输出其回文子序列个数 样例输入 abaa 样例输出 10 注释 本例中其所有回文子序列为: a,b,a,a,aba,aba,aa,aa,aa,aaa 一个字符串的子序列是指在原字符串上去除某些字符但不破坏余下元素的相对位置(在前或在后)而形成的新字符串. #include<iostream> #include<string>

【后缀数组|最长回文子串】URAL-1297 Palindrome

1297.Palindrome Time limit: 1.0 second Memory limit: 64 MB The "U.S. Robots" HQ has just received a rather alarming anonymous letter. It states that the agent from the competing ?Robots Unlimited? has infiltrated into "U.S. Robotics".