南大算法設計與分析課程OJ答案代碼(4)--變位詞、三數之和

                問題 A: 變位詞

時間限制: 2 Sec  內存限制: 10 MB
提交: 322  解決: 59
提交 狀態 算法問答 

題目描述

請你們在作oj題以前,仔細閱讀關於抄襲的說明http://www.bigoh.net/JudgeOnline/. php


變位詞是指由相同的字母組成的單詞,如eat、tea是變位詞。本次問題給出一串單詞,你須要找到全部的變位詞。 c++

輸入

輸入由兩行組成:第一行是全部單詞的總數,第二行是由空格分隔的單詞列表。兩行末尾都有空格。 算法

注:爲防歧義,輸入的單詞都是小寫 數組

輸出

此次須要你們先輸出一個字符串,它是「我已閱讀關於抄襲的說明」的漢語拼音.輸出此行的提交咱們將認爲已經徹底閱讀並瞭解了「關於抄襲的說明」公告. spa

第二行是變位詞組的個數,後面是全部的變位詞。每一個輸出的變位詞佔一行。一組變位詞只須要輸出一個字典序最小的表明便可,如eat、tea中eat字典序小於tea,因此輸出eat。變位詞與變位詞也按照字典序從小到大排列,如eat和el中eat字典序小於el因此eat在el前面。 .net

輸出的每一行最後都沒有空格。 code

樣例輸入

9 a ew vc tea oe eat zoo el le 

樣例輸出

wo yi yue du guan yu chao xi de shuo ming 2 eat el

提示

使用代價爲O(nlgn)的方法。blog

 代碼

複雜度要達到nlogn,讀入輸入字符串是n複雜度,就是說插入部分爲logn的複雜度,確定就是使用樹結構,c++中map使用平衡二叉樹實現,能夠直接使用。排序

int main() { int len = 0; cin >> len; /* 第一個string表明sort(temp.begin(), temp.end()),這是爲了把變位詞彙集在一塊兒 第二個string表明一個變位詞集合中最小的元素 第三個int表明出現次數 */ map<string, pair<string,int>> m; int  result = 0; string temp; for (int i = 0; i < len; i++) { cin >> temp; string orgin = temp; sort(temp.begin(), temp.end()); m[temp].second++; if (m[temp].second == 1) m[temp].first = orgin; else if (m[temp].second >= 2) { if (orgin < m[temp].first) m[temp].first = orgin; if(m[temp].second == 2) result++; } } cout << "wo yi yue du guan yu chao xi de shuo ming" << endl; cout << result << endl; vector<string> v; v.reserve(result); for (auto k = m.begin(); k!=m.end() ; k++) { if ((*k).second.second >= 2) v.emplace_back((*k).second.first); } //m是使用string內部字符排序後的值做爲索引,還要排個序
 sort(v.begin(), v.end()); for (auto q = v.begin(); q != v.end(); q++) cout << *q << endl; return 0; }

 

問題 B: 三數之和

時間限制: 1 Sec  內存限制: 2 MB
提交: 113  解決: 56
提交 狀態 算法問答 

題目描述

一個沒有重複元素的整數數組,給定某個整數,找到全部triple之和等於該整數的個數,其中triple是數組中的不一樣的3個數。

輸入

數組長度,以及要求的三數之和; 索引

沒有重複元素的數組。

輸出

已閱讀抄襲的說明;

全部triple的個數。

樣例輸入

6 3 8 0 -5 -2 6 -1

樣例輸出

wo yi yue du guan yu chao xi de shuo ming 2

提示

代碼

題目沒有重複元素,簡便了一些,先排序,而後肯定一個元素的位置,剩下兩個元素採用兩邊逼近的方式來求。能夠見Leetcode15,3 sum問題,比這個稍微複雜一點,思路徹底相同

int main() { int len = 0; int sum = 0; cin >> len; cin >> sum; vector<int> v; v.reserve(len); int temp; for (int i = 0; i < len; i++) { cin >> temp; v.emplace_back(temp); } sort(v.begin(), v.end()); int times = 0; for (int i = 0; i < len - 2; i++) { int pos2 = i + 1; int pos3 = len - 1; while (pos2 < pos3) { if (v[i] + v[pos2] + v[pos3] < sum) { pos2++; }else if(v[i] + v[pos2] + v[pos3] > sum){ pos3--; }else { times++; pos2++; } } } cout << "wo yi yue du guan yu chao xi de shuo ming" << endl; cout << times << endl; return 0; }
相關文章
相關標籤/搜索