begin

[LeetCode]819. 最常见的单词

[亡魂溺海] 提交于 2020-01-25 07:12:38
题目 给定一个段落 (paragraph) 和一个禁用单词列表 (banned)。返回出现次数最多,同时不在禁用列表中的单词。题目保证至少有一个词不在禁用列表中,而且答案唯一。 禁用列表中的单词用小写字母表示,不含标点符号。段落中的单词不区分大小写。答案都是小写字母。 示例: 输入: paragraph = "Bob hit a ball, the hit BALL flew far after it was hit." banned = ["hit"] 输出: "ball" 解释: "hit" 出现了3次,但它是一个禁用的单词。 "ball" 出现了2次 (同时没有其他单词出现2次),所以它是段落里出现次数最多的,且不在禁用列表中的单词。 注意,所有这些单词在段落里不区分大小写,标点符号需要忽略(即使是紧挨着单词也忽略, 比如 "ball,"), "hit"不是最终的答案,虽然它出现次数更多,但它在禁用单词列表中。 说明: 1 <= 段落长度 <= 1000. 1 <= 禁用单词个数 <= 100. 1 <= 禁用单词长度 <= 10. 答案是唯一的, 且都是小写字母 (即使在 paragraph 里是大写的,即使是一些特定的名词,答案都是小写的。) paragraph 只包含字母、空格和下列标点符号!?',;. paragraph 里单词之间都由空格隔开。

字符串的排列

笑着哭i 提交于 2020-01-25 06:58:19
题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。注意要排序!!&&输入可能有重复!! class Solution { public: vector<string> res; void pmu(string str,int begin,int len) { if(begin==str.size()-1) { res.push_back(str); return; } sort(str.begin()+begin,str.end()); for(int i=begin;i<len;i++) { if(begin!=i&&str[begin]==str[i]) continue; char tmp=str[begin]; str[begin]=str[i]; str[i]=tmp; pmu(str,begin+1,len); tmp=str[i]; str[i]=str[begin]; str[begin]=tmp; } } vector<string> Permutation(string str) { if(str.empty())

字符串的排列

牧云@^-^@ 提交于 2020-01-25 06:57:12
题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。 1 class Solution { 2 public: 3 void Permutation(string str,int begin,int end,vector<string>& result) 4 { 5 if (begin > end) 6 { 7 result.push_back(str); 8 return; 9 } 10 for (int i = begin ; i <= end ; ++i) 11 { 12 if(str[begin] != str[i] || begin == i) 13 { 14 char tem = str[begin]; 15 str[begin] = str[i]; 16 str[i] = tem; 17 Permutation(str,begin+1,end,result); 18 tem = str[begin]; 19 str[begin] = str[i]; 20 str[i] = tem; 21 } 22 } 23 } 24 vector

LeetCode--字符串

你说的曾经没有我的故事 提交于 2020-01-24 10:13:33
1、给定字符串s,分区s使得分区的每个子字符串都是回文。 返回s的所有可能的回文分区。 例如,给定s =“aab”, 返回 [ ["aa","b"], ["a","a","b"] ] class Solution { public: void dfs(string s,vector<string>&path,vector<vector<string>>&res){ if(s.size() < 1){ res.push_back(path); return; } for(int i = 0;i<s.size();i++){ int begin = 0; int end = i; while(begin < end){ if(s[begin] == s[end]){ begin++; end--; } else break; } if(begin >= end){ path.push_back(s.substr(0,i+1)); dfs(s.substr(i+1), path,res); path.pop_back(); } } } vector<vector<string>> partition(string s) { vector<vector<string>>res; vector<string>path; dfs(s,path,res); return res; } }; 2

【c++】STL之set用法总结

こ雲淡風輕ζ 提交于 2020-01-24 02:11:26
介绍 set和multiset会根据特定准则将元素自动排序(从小到大)。两者的不同之处在于multiset允许元素重复而set不允许。 所以不能直接改变元素值,因为这样会打乱原本正确的顺序。因此要改变元素值必须先删除旧元素,再插入新元素。 C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树,所以被STL选择作为了关联容器的内部结构。 用法 1 头文件 # include <set> 2 非更易型操作,用来查询大小互相比较 c.key_comp() c.value_comp() c.empty()——返回容器是否为空 c.size()——返回目前元素的个数 c.max_size()——返回元素个数之最大可能量 c1==c2 c1!=c2 … 3 查找 c.count(val)——返回元素值为val的元素个数,有些就没有count函数,比如vector之类的容器没有count c.find(val)——返回元素值为val的第一个元素,如果找不到就返回end() 4.迭代器 begin(); // 返回指向第一个元素的迭代器 end(); // 返回指向最后一个元素的迭代器 rbegin()

八皇后问题

浪子不回头ぞ 提交于 2020-01-23 16:05:56
8个皇后的任意两个不能处在同一行,那么肯定是每一个皇后占一行。 于是我们可以定义一个string字符串,字符串中第i个数字表示位于第i行的皇后的列号。 先把string字符串分别用0~7初始化,接下来就是对字符串做全排列。 因为我们用不同的数字初始化字符串,所以任意两个皇后肯定不同列。 我们只需判断每一个排列对应的8个皇后是不是在同一对角线上, 也就是对于string的两个下标i和j,是不是有: ( j - i ) == ( str[i] - str[j] ) 或者 ( i - j ) == ( str[i] - str[j] )。 具体代码如下: 1 void Permutation(string Str, int begin, int end ,vector<string>& vec)//得到全排列 2 { 3 if(begin == end - 1) //只剩一个元素 4 { 5 vec.push_back(Str); 6 } 7 else 8 { 9 for(int k = begin; k < end; k++) 10 { 11 swap(Str[k], Str[begin]); //交换两个字符 12 Permutation(Str, begin + 1, end ,vec); 13 swap(Str[k],Str[begin]); //恢复 14 } 15 } 16

lower_bound和upper_bound

送分小仙女□ 提交于 2020-01-23 15:56:39
lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找。 在从小到大的排序数组中, lower_bound(begin, end, num); 从数组的begin位置到end-1 位置二分查找第一个大于等于num的数字,找到返回该数字的地址,不存在返回end。通过返回的地址减去起始地址begin,得到数字在数组中的下标。 upper_bound(begin, end, num); 从数组的begin位置到end-1 位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在返回end。通过返回的地址减去起始地址begin,得到数字在数组中的下标。 在从大到小的排序数组中, 重载lower_bound()和upper_bound() lower_bound( begin,end,num,greater< type>() ):从数组的begin位置到end-1位置二分查找第一个 小于或等于 num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。 upper_bound( begin,end,num,greater< type>() ):从数组的begin位置到end-1位置二分查找第一个 小于 num的数字,找到返回该数字的地址,不存在则返回end

线段树 & 题目

非 Y 不嫁゛ 提交于 2020-01-23 13:08:42
首先说下我写的线段树吧。 我是按照线段树【完全版】那个人的写法来写的,因为网上大多数题解都是按照他的写法来写。 确实比较飘逸,所以就借用了。 节点大小是maxn是4倍,准确来说是大于maxn的2^x次方的最小值的两倍。 lson 和 rson 用宏定义写了。因为是固定的量。 线段树不必保存自身的区间,因为一边传递过去的时候,在函数里就有区间表示,无谓开多些无用的变量。 pushUp函数,更新当前节点cur的值,其实就是,线段树一般都是处理完左右孩子,然后再递归更新父亲的嘛,这个pushUp函数就是用来更新父亲的。感觉不用这个函数更加清楚明了。 pushDown函数,在lazy--upDate的时候有用,作用是把延迟标记更新到左右节点。 多次使用sum不用清0,add要。build的时候就会初始化sum数据。但其他用法就可能要 1 #define lson L, mid, cur << 1 2 #define rson mid + 1, R, cur << 1 | 1 3 void pushUp(int cur) { 4 sum[cur] = sum[cur << 1] + sum[cur << 1 | 1]; 5 } 6 void pushDown(int cur, int total) { 7 if (add[cur]) { 8 add[cur << 1] += add[cur]

STL find函数

核能气质少年 提交于 2020-01-22 10:19:25
本博客是转载其他大佬的文章,觉得他写的很好所以转载。侵权删除 1、 find()函数的调用形式为 find(start,end,value) start搜寻的起点,end搜寻的终点,要寻找的value值   容器的表示方法:find(a.begin(),a.end(),value) 数组的表示方法:find(a,a+length,value) 所有的返回,均是迭代器(容器)或指针(数组),而非是直观感觉上的索引下标。如果在查找范围内不存在,返回a.end(),这里需要注意的是,a.end()不在查找范围内。 2. vector没有实现find函数,除此之外,常见容器都实现了自己的find函数。 这个案例是洛谷p1540 #include<iostream> #include<algorithm> #include<vector> using namespace std; int main() { int m,n,t,cnt=0; cin>>m>>n; vector<int> v; while(cin>>t) { if(find(v.begin() , v.end()) , t) == v.end()) { v.push_back(t); cnt++; } if(v.size()>m) v.erase(v.begin()); } cout<<cnt; return 0; }

LCS笔记

不羁岁月 提交于 2020-01-22 08:27:17
求两个字符串的最长公共子序列 公共子序列的定义:如字符串 a b c d e f abcdef a b c d e f 和字符串 e f c a b d efcabd e f c a b d ,公共子序列就有 a b , c d , e f , a b d ab,cd,ef,abd a b , c d , e f , a b d 等 dp解法: 设 f [ i ] [ j ] f[i][j] f [ i ] [ j ] 表示直至第一个串的第 i i i 位,第二个串的第 j j j 位为止的最长公共子序列 可以推导出状态转移方程: 当第一个串的第 i i i 个字符等于第二个串的第 j j j 个字符时, f [ i ] [ j ] = f [ i − 1 ] [ j − 1 ] + 1 f[i][j]=f[i-1][j-1]+1 f [ i ] [ j ] = f [ i − 1 ] [ j − 1 ] + 1 否则就继承以前的状态,也就是 f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j ] , f [ i ] [ j − 1 ] ) f[i][j]=max(f[i-1][j],f[i][j-1]) f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j ] , f [ i ] [ j − 1 ] )