1. 程式人生 > >今日頭條演算法題-求句子中相同單詞的個數

今日頭條演算法題-求句子中相同單詞的個數

給定一個英文段落(包含 n 個句子)和 m 次查詢,每次給定一個句子,求段落中相同單詞數量最多的句子。各個英文句子不包含標點,大小寫不敏感。


#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<stdio.h>
using namespace std;

vector<vector<string>> seqsToWords(vector<string> seq){
	vector<vector<string>> dic;
	for (int i = 0; i < seq.size(); i++){
		vector<string> words;
		int previous = 0;
		string temp;
		for (int j = 0; j < seq[i].size(); j++){
			if (seq[i][j] == ' '){
				temp = seq[i].substr(previous, j - previous);
				auto it = find(words.begin(), words.end(), temp);
				if (it != words.end()){
					words.push_back(temp);
				}
				previous = j + 1;
			}
		}
		temp = seq[i].substr(previous, seq[i].size() - previous);
		auto it = find(words.begin(), words.end(), temp);
		if (it != words.end()){
			words.push_back(temp);
		}
		dic.push_back(words);
	}
	return dic;
}
int findSameNumber(vector<vector<string>> dic, vector<string> queryWords){
	int maxNumber=0;
	int index = 0;
	for (int i = 0; i < dic.size(); i++){
		int number = 0;
		for (int j = 0; j < queryWords.size(); j++){
			auto it = find(dic[i].begin(), dic[i].end(), queryWords[j]);
			if (it != dic[i].end()){
				number++;
			}
		}
		if (number > maxNumber) {
			maxNumber = number;
			index = i;
		}
	}
	return index;
}
vector<string> solve(vector<string> seq, vector<string> query){
	vector<string> result;
	vector<vector<string>> dic;
	vector<vector<string>> queryWords;
	dic = seqsToWords(seq);
	queryWords = seqsToWords(query);
	for (int i = 0; i < queryWords.size(); i++){
		int index = findSameNumber(dic, queryWords[i]);
		result.push_back(seq[i]);
	}
	return result;
}

int main() {
	int n;
	vector<string> seqs;
	cin >> n;
	int m;
	vector<string> query;
	cin >> m;
	string temp;
	getline(cin, temp);//讀取第一行的換行符
	for (int i = 0; i < n; i++){
		getline(cin,temp);
		seqs.push_back(temp);
	}
	for (int i = 0; i < m; i++){
		getline(cin, temp);
		query.push_back(temp);
	}
	vector<string> result = solve(seqs,query);
	for (int i = 0; i < m; i++){
		cout << result[i] << endl;
	}
	
	return 0;
}

相關推薦

今日頭條演算法-句子相同單詞個數

給定一個英文段落(包含 n 個句子)和 m 次查詢,每次給定一個句子,求段落中相同單詞數量最多的句子。各個英文句子不包含標點,大小寫不敏感。 #include<iostream> #include<vector> #include<string

資料結構演算法/陣列大小最接近的兩個元素的差

考慮下面這個演算法,它求的是數值陣列中大小最接近的兩個元素的差。 可對比看下求陣列中兩個元素差的最大值https://blog.csdn.net/fkyyly/article/details/83930343 演算法: MinDistance(A[0..n-1])

演算法陣列某兩個數的和為目標值

給定一個整型陣列和一個目標值,如果陣列中某兩個數相加等於目標值,請返回這兩個數的下標。 Example: Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7

統計句子單詞個數

from collections import Counter def bag_of_words(text): # TODO: Implement bag of words retur

2018今日頭條演算法面試程式設計2

給定一個數組序列, 需要求選出一個區間, 使得該區間是所有區間中經過如下計算的值最大的一個:區間中的最小數 * 區間所有數的和最後程式輸出經過計算後的最大值即可,不需要輸出具體的區間。如給定序列  [6 2 1]則根據上述公式, 可得到所有可以選定各個區間的計算值:[6] =

資料結構演算法/將陣列元素奇數排在前面偶數在後面(前面奇數和後面的偶數分別有序)

一個無序整數陣列,對它排序,使其前半部分都為奇數有序,後半部分為偶數有序。 (1)方案1 O(n^2) 基本想法:利用插入排序演算法,對奇偶子序列分別插入排序。用兩個變數把整個陣列分割為三個部分,第一個部分為奇數有序子序列,第二部分為偶數有序子序列,第三部分為未排序子序列。使用兩個變數進行分

資料結構演算法/將陣列元素奇數排在前面偶數在後面(前面奇數和後面的偶數不需要有序)

  處理策略是定義兩個指標pHead,pTail並令其初始指向陣列頭節點和尾節點。pHead從前往後找應該放在尾部的偶數節點,pTail從後往前找應該放在頭部的奇數節點,若pHead位於pTail之前則交換二者內容,否則結束處理過程。 處理流程如下圖所示。從圖中可以看出時間複

資料結構演算法/刪除陣列重複元素

題目   給定一個排序的陣列,將陣列中的重複元素去掉,相同的只保留一個,並且返回陣列新的元素個數, 不要建立一個新的陣列來儲存結果。在常量時間內解決這個問題  解題思路   從第二個元素開始處理,記為當前處理的元素,如果當前元素與他的前一個元素相同就刪除這個元素, 如果不同就將它移動到正

今日頭條演算法原理(全文)

今天,演算法分發已經是資訊平臺、搜尋引擎、瀏覽器、社交軟體等幾乎所有軟體的標配,但同時,演算法也開始面臨質疑、挑戰和誤解。今日頭條的推薦演算法,從2012年9月第一版開發執行至今,已經經過四次大的調整和修改。 今日頭條委託資深演算法架構師曹歡歡博士,公開今日頭條的演算法原理,以期推動整

程式設計師面試一百-07-翻轉句子單詞順序

1-題目 : 輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字元的順序不變;句子中單詞以空格符隔開;為簡單起見,標點符號和普通字母一樣處理。 2-示例 : 輸入 : “I am a student.” 輸出 : “student. a am I” 3-思路 : 可以先顛倒句子中

PHP版今日頭條演算法面試題(持續更新)

1,現在有一個字串,你要對這個字串進行 n 次操作,每次操作給出兩個數字:(p, l) 表示當前字串中從下標為 p 的字元開始的長度為 l 的一個子串。你要將這個子串左右翻轉後插在這個子串原來位置的正後方,求最後得到的字串是什麼。字串的下標是從 0 開始的,你可以從樣例中得

經典演算法之Floyd演算法任意一對頂點間的最短路徑)

/************************ author's email:[email protected] date:2018.1.30 *********************

演算法---二進位制1的個數

學習的地址:原文地址 問題描述   任意給定一個32位無符號整數n,求n的二進位制表示中1的個數,比如n = 5(0101)時,返回2,n = 15(1111)時,返回4。 1.普通法   我總是習慣叫普通法,因為我實在找不到一個合適的名字來描述它,其實就是最簡

演算法陣列的元素和為某個數

1、更簡單一點的題目:判斷總共n個數,從1-n,找出其中和為 S的一段序列 這個題目採用的是:用維持一個視窗,如果視窗中的數小於了S就像S向右擴張,如果大於S就把左邊的數去掉 import java.util.ArrayList; public clas

資料結構演算法/尋找陣列唯一出現兩次的數

假設你有一個用1001個整陣列成的陣列,這些整數是任意排列的,但是你知道所有的整數都在1到1000(包括1000)之間。此外,除一個數字出現兩次外,其他所有數字只出現一次。假設你只能對這個陣列做一次處理,用一種演算法找出重複的那個數字。如果你在運算中使用了輔助的儲存方式,那麼你能找到不用這種方式的演

今日頭條[程式設計] 手串

作為一個手串藝人,有金主向你訂購了一條包含n個雜色串珠的手串——每個串珠要麼無色,要麼塗了若干種顏色。為了使手串的色彩看起來不那麼單調,金主要求,手串上的任意一種顏色(不包含無色),在任意連續的m個串珠裡至多出現一次(注意這裡手串是一個環形)。手串上的顏色一共有c種。現在按順

Python演算法----在列表找到和為s的兩個數字

    列表data的值為[1, 3, 4, 5, 8, 9, 11],找出這個列表中和為13的兩個數字的所有組合。這個好找,上過幼兒園大班的,估計都能找出來。4+9=13, 5+8=13。如何用pyt

經典演算法之Dijkstra演算法任意一對頂點間的最短路徑)

/************************ author's email:[email protected] date:2018.1.30 ************************/ /* 迪傑斯特拉演算法思想: 設有兩個頂點集合S和T,集合S中

京東演算法---

題目: 冪運算有一些有趣的性質:9^3=27^2, 2^10=32^2 。給出一個整數n,找出滿足a^b=c^d(1≤a,b,c,d≤n)的式子有多少個,如:n=2時,滿足條件的式子有: 1^1 = 1^1 1^1 = 1^2 1^2 = 1^1 1^2 = 1^2 2^1

今日頭條演算法原理詳解全集,值得收藏!

今天,演算法分發已經是資訊平臺、搜尋引擎、瀏覽器、社交軟體等幾乎所有軟體的標配,但同時,演算法也開始面臨質疑、挑戰和誤解。今日頭條