字符串中的最大重复单词

时间:2011-03-23 00:38:53

标签: c++ arrays

我试图做一个非常常见的面试问题“在字符串中找到最大重复的单词”并且在c / c ++实现中找不到很多网络资源。所以我自己在这里编码。 我试图从头开始编写大部分代码以便更好地理解。 你能查看我的代码并提供我的算法评论。有些人建议使用哈希表来存储计数,但这里没有使用哈希表。

#include<stdafx.h>
#include<stdlib.h>
#include<stdio.h>
#include<string>
#include<iostream>
using namespace std;
string word[10];

//splitting string into words
int parsestr(string str)
{   
    int index = 0;
    int i = 0;
    int maxlength = str.length();
    int wordcnt = 0;
    while(i < maxlength)
    {
        if(str[i]!= ' ')
        {
            word[index] = word[index]+str[i];
        }
        else
        {
            index++;//new word
            wordcnt = index;
        }
    i++;
    }
    return wordcnt;
}

//find the max word count out of the array and return the word corresponding to that index.
string maxrepeatedWord(int wordcntArr[],int count)
{
int max = 0;
int index = 0;
    for(int i=0;i<=count;i++)
    {
        if(wordcntArr[i] > max)
        {
        max = wordcntArr[i];
        index = i;
        }
    }

    return word[index];
}
void countwords(int count)
{
    int wordcnt = 0;
    int wordcntArr[10];
    string maxrepeatedword;
    for(int i=0;i<=count ;i++)
    {
        for(int j=0;j<=count;j++)
        {
            if(word[i]==word[j])
            {
            wordcnt++;
            //word[j] = "";
            }
            else
            {}
        }
        cout<<" word "<< word[i] <<" occurs "<< wordcnt <<" times "<<endl;
        wordcntArr[i] = wordcnt;
        wordcnt = 0;
    }

    maxrepeatedword = maxrepeatedWord(wordcntArr,count);
    cout<< " Max Repeated Word is " << maxrepeatedword;
}

int main()
{
string str = "I am am am good good";
int wordcount = 0;
wordcount = parsestr(str);
countwords(wordcount);
}

3 个答案:

答案 0 :(得分:4)

仅仅为了比较,最明显的方法是C ++:

#include <map>
#include <string>
#include <iostream>
#include <sstream>

int main()
{
    std::istringstream input("I am am am good good");
    std::map<std::string, int> count;
    std::string word;
    decltype(count)::const_iterator most_common;
    while (input >> word)
    {
        auto iterator = count.emplace(word, 0).first;
        ++iterator->second;
        if (count.size() == 1 ||
            iterator->second > most_common->second)
            most_common = iterator;
    }
    std::cout << '\"' << most_common->first << "' repeated "
         << most_common->second << " times\n";
}

看到它运行here

注意:

  • map::emplace返回pair<iterator,bool>,表示单词&amp;它的数量在map,以及是否新插入。我们只关心 where 所以捕获emplace(...).first

  • 当我们更新计数时,我们会检查是否使该单词成为目前为止看到的最常见单词。如果是这样,我们将迭代器复制到局部变量most_common,因此我们记录了目前最常见的单词及其计数。

你正在做的一些值得思考的事情:

  • word是一个全局变量 - 将事物作为函数参数传递是一个好习惯,除非它非常不方便,这意味着代码可以更容易地从异步信号处理程序或其他线程中重用,并且在查找中更为明显在函数调用站点,输入和输出可能是什么。按原样,通话countwords(wordcount)使其看起来像countwords'唯一的输入是int wordcount
  • 固定大小的数组:如果你超过10个单词,你就会陷入困境。 C ++标准容器可以按需增长。
  • 您可以使用一些便利功能,例如std::string::operator+=(char)更简洁地追加char ala my_string += my_char;

一般来说,你的代码非常合理,并且对迭代和解决问题有很好的理解,所有这些都是非常低级的,但这是一个非常实用的理解的好东西。

答案 1 :(得分:0)

代码段:

void mostRepeat(string words[], int n)
{
    int hash[n]={0};

    for(int j=0; j<n; j++)
    {
      for(int i=0; i<n; i++)
      {
        if(words[j]==words[i])  hash[j]++;
      }
    }

    int maxi = hash[0];
    int index = 0;

    for(int i=0; i<n; i++)
    {
       if(maxi<hash[i])
       {
          maxi=hash[i];
          index = i;
       }
    }
    cout<<words[index]<<endl;
}

完整计划:Link

答案 2 :(得分:0)

import java.util.*;

public class StringWordDuplicates {

    static void duplicate(String inputString){

        HashMap<String, Integer> wordCount = new HashMap<String,Integer>();
        String[] words = inputString.split(" ");

        for(String word : words){
            if(wordCount.containsKey(word)){
                wordCount.put(word, wordCount.get(word)+1);             
            }
            else{
                wordCount.put(word, 1);
            }
        }
        //Extracting of all keys of word count
        Set<String> wordsInString = wordCount.keySet();

        for(String word : wordsInString){
            if(wordCount.get(word)>1){
                System.out.println(word+":"+wordCount.get(word));
            }
        }

    }
    public static void main(String args[]){
        duplicate("I am Java Programmer and IT Server Programmer with Java as Best Java lover");

    }
}