zoukankan      html  css  js  c++  java
  • Lintcode--003(乱序字符串)

    给出一个字符串数组S,找到其中所有的乱序字符串(Anagram)。如果一个字符串是乱序字符串,那么他存在一个字母集合相同,但顺序不同的字符串也在S中。

    注意事项

    所有的字符串都只包含小写字母

     
    样例

    对于字符串数组 ["lint","intl","inlt","code"]

    返回 ["lint","inlt","intl"]

    标签 

     第一次尝试解决,方法复杂,且不能通过。代码如下:

    class Solution {
    public:    
        /**
         * @param strs: A list of strings
         * @return: A list of strings
         */
        vector<string> anagrams(vector<string> &strs) {//vector<string> s;   //定义个一个字符串容器s
            // write your code here
            
            //先考虑边界情况,如果字符串数组s中的所有字符串,都不等长,则不存在乱序字符串;
            for(int i=0;i<strs.size();i++){
                int a[i]=strs[i].size();
            }
            for(int j=0;j<strs.size()-1;j++){
                for(int k=j+1;k<strs.size();k++){
                    if(a[j]>0&&a[k]>0&&a[j]==a[k]){
                        vector<string> s;
                        s.push_back(strs[j]);
                        strs[j]=" ";
                        s.push_back(strs[k]);
                    }
                    else{
                        return null;
                    }
                }
            }
            int letters[s.size()][26];
            memset(letters,0,letters);
            for (int m=0;m<s.size();m++){
                string ll;
                ll=s[i];
                for(n=0;n<ll.size();n++){
                    letters[m][ll[n]-'a']++;
                }
            }
            
            vector<string> t;
            for (int a=0;a<s.size()-1;a++){
                for(int b=a+1;b<s.size();b++){
                    for(int c=0;c<26;){
                    if (letters[a][c]==letters[b][c])
                    {
                        c=c+1;
                    }
                    else{
                        continue;
                    }
                }
                t.push_back(s[a]);
                s[a]=" ";
                t.push_back(s[b]);
            }
            return t;
        }
    };

    二次参考:http://blog.csdn.net/wangyuquanliuli/article/details/45792029

    解决思路很简单:对每个字符串进行排序,然后用hash表记录个数就行

    class Solution {
    public:    
        /**
         * @param strs: A list of strings
         * @return: A list of strings
         */
        vector<string> anagrams(vector<string> &strs) {//vector<string> s;   定义个一个字符串容器s
            // write your code here
            //分析:对每个字符串进行排序,然后用hash表记录个数就行
            
            
            map<string,int> m;  //定义一个关联容器(hash表),提供一对一的数据处理能力。初始值为0;
            for(auto s:strs)  //s与strs[i]属于同种类型,也就是说,都是字符串,从第一个字符串到最后一个字符串;
            {  
                sort(s.begin(),s.end());  //对字符串数组中的每个字符串进行排序
                m[s]++;  //将排序后的s,他的值加1,但这个排序不影响strs本身,只作用于for里面。
            }  
            vector<string> ret;  //定义一个字符串容器
            for(auto s:strs)  
            {  
                auto temp = s;  
                sort(temp.begin(),temp.end());  //将每个字符串排序,如果排序之后,发现最后的m[temp]值大于1,则说明是乱序。
                if(m[temp]>1)  
                    ret.push_back(s);  //把乱序的字符串放到容器中,这样遍历每个字符串,就可以得到最终的结果。
            }  
            return ret;  
        }
    };

    1. 关于字符串容器的定义和操作:

    vector<string> vec;//定义个一个字符串容器,相当于字符串数组;
    string str;
    str = "abc";
    vec.push_back(str);//把字符串str压进容器,必须使用push_back()动态添加新元素
    vec.push_back("def");//把字符串"def"压进容器
    vec.push_back("123");
    for(int i=0; i<vec.size(); i++)
    {
    cout<<vec[i]<<endl;//打印容器的内容
    }
    vec.pop_back();//取出容器中最后一个
    for(int i=0; i<vec.size(); i++)
    {
    cout<<vec[i]<<endl;//打印容器的内容
    }

    若要一次性初始化,如下:

    vec.resize(4,"abc"); //一次性有4个abc

    2. 字符串相关:

    【s.size()函数返回字符串s中的字符个数;s.empty()用来确认字符串s是否为空;】

    string类型拼接符"+"必须与一个string类型相邻 ,不能在两侧都是字符串常量】

    注:关于hash表与HashMap原理,区别以及实现在面试中频繁出现,需要深刻理解。

    3. hash表原理参考 (1). http://www.cnblogs.com/dolphin0520/archive/2012/09/28/2700000.html

                                      (2). http://blog.chinaunix.net/uid-24951403-id-2212565.html

                                      (3). http://kb.cnblogs.com/page/189480/

    4. HashMap原理参考 (1). http://blog.csdn.net/vking_wang/article/details/14166593#t0

                                          (2). http://my.oschina.net/boxizen/blog/177744

     Map的详细用法:   http://blog.csdn.net/sunshinewave/article/details/8067862

  • 相关阅读:
    Codeforces 992C(数学)
    Codeforces 990C (思维)
    Codeforces 989C (构造)
    POJ 1511 Invitation Cards(链式前向星,dij,反向建边)
    Codeforces 1335E2 Three Blocks Palindrome (hard version)(暴力)
    POJ 3273 Monthly Expense(二分)
    POJ 2566 Bound Found(尺取前缀和)
    POJ 1321 棋盘问题(dfs)
    HDU 1506 Largest Rectangle in a Histogram(单调栈)
    POJ 2823 Sliding Window(单调队列)
  • 原文地址:https://www.cnblogs.com/Allen-rg/p/5790516.html
Copyright © 2011-2022 走看看