一些leetcode算法题
DFS算法
思想:一直往深处走,直到找到解或者走不下去为止
DFS(dep,...) // dep代表目前DFS的深度
{
if (找到解或者走不下去了){
return;
}
枚举下种情况,DFS(dep + , ...)
} DFS: 使用栈保存未被检测的节点,结点按照深度优先的次序被访问并依次压入栈中,并以相反的次序出栈进行新的检测
类似于树的先根遍历,深搜的例子:走迷宫,没有办法用分身术来站在每一个走过的位置。
例子:
leetcode class Solution {
public:
string DFS(string s, int &k){ // 在所有的层中是维护一个共同的索引值k
string ans;
int cnt = ;
while(k < s.size())
{
if(isdigit(s[k])){ // 判断是否是数字
cnt = cnt * + s[k++]-''; // 如果是遇到100这样的数字,那么则需要这样处理
}
else if(s[k]=='['){ // 如果是左括号,则要进入下层递归
string tem = DFS(s, ++k); // 递归调用
for(int i = ; i < cnt; i++){
ans += tem;
}
cnt = ; //
}
else if(s[k]==']'){
k++;
return ans;
}
else ans += s[k++]; // 若是普通数字就直接加上
}
return ans;
} string decodeString(string s){
string res;
int k = ;
return DFS(s, k);
}
}; leetcode Unique Substring in Wraparounding string 思路:这道题说有一个无限长的封装字符串,然后又给了我们另一
个字符串p,问我们p有多少非空子字符串在封装字符串中。我们通过
观察题目中的例子可以发现,由于封装字符串是26个字符按顺序无限
循环组成的,那么满足题意的p的子字符串要么是单一的字符,要么是
按字母顺序的子字符串。这道题遍历p的所有子字符串会TLE,因为如
果p很大的话,子字符串很多,会有大量的满足题意的重复子字符串,
必须要用到trick,而所谓技巧就是一般来说你想不到的方法。我们看
abcd这个字符串,以d结尾的子字符串有abcd, bcd, cd, d,那么我们
可以发现bcd或者cd这些以d结尾的字符串的子字符串都包含在abcd中,
那么我们知道以某个字符结束的最大字符串包含其他以该字符结束的字符
串的所有子字符串,说起来很拗口,但是理解了我上面举的例子就行。
那么题目就可以转换为分别求出以每个字符(a-z)为结束字符的最长连续
字符串就行了,我们用一个数组cnt记录下来,最后再求出数组cnt的所有
数字之和就是我们要的结果啦 class Solution {
public:
int findSubstringInWraproundString(string p) { // 很有技巧的一个题
vector<int> cnt(, ); // 对应26个字母,注意vector的初始化
int len = ;
for (int i = ; i < p.size(); ++i) {
if (i > && (p[i] == p[i - ] + || p[i - ] - p[i] == )) {
++len;
}
else {
len = ; // 若是不再连续就将len置1重新开始
}
cnt[p[i] - 'a'] = max(cnt[p[i] - 'a'], len); // 用len的值更新cnt的值
}
return accumulate(cnt.begin(), cnt.end(), ); // 将cnt的所有的值累加起来
}
}; leetcode . Palindromic Substrings 回文字串 题目:
Given a string, your task is to count how many palindromic substrings in this string. The substrings with different start indexes or end indexes are counted as different substrings even they consist
of same characters. Example :
Input: "abc"
Output:
Explanation: Three palindromic strings: "a", "b", "c".
Example :
Input: "aaa"
Output:
Explanation: Six palindromic strings: "a", "a", "a", "aa", "aa", "aaa". 思路一:dp思想
参考链接:http://blog.csdn.net/lishichengyan/article/details/77103324
定义d[i][j]:若从i到j的字符串为回文,则为真(),否则为假(),那么d[i][j]为真的前提是:头尾两个字符串相同并且去掉头尾以后的字串也是
回文(即d[i+][j-]为真),这里面要注意特殊情况,即:去掉头尾以后为空串,所以如果j-i<,并且头尾相等,也是回文的。 class Solution {
public:
int countSubstrings(string s) {
int n = s.size(), count = ;
vector<vector<int>> dp(n, vector<int> (n)); //二维vector初始化,打表
for ( int end = ; end < n; ++end ) {
dp[end][end] = ; // 每一个字符都是一个回文
++count;
for ( int start = ; start < end; ++start ) {
if ( s[start] == s[end] && (start+ >= end- || dp[start+][end-])) {
dp[start][end] = ;
++count; // 有一个为真那么结果值就加一
}
}
}
return count;
}
}; 题意是给你一个字符串,求它有多少个回文子串。注意回文子字符串有奇数和偶数两种形式,,奇数
以字符串每一个字符为回文中心,然后向两边扩散,求以每个中心获得的回文子串个数,然后加起来。
. 偶数。把每个i位置作为最中间两个字符的左边那个,即i,i+1两个数是回文中心。把奇数和偶数的情况加起来就是
结果
思路二: 使用从 中心向外扩展的方法,注意回文的字符串个数为奇数或者偶数的时候 class Solution {
public:
int helper(string s, int start, int end){
int res = ;
int len = s.size();
while (start >= && end <= len && s[start] == s[end]){
res++;
start--;
end++;
}
return res;
}
int countSubstrings(string s) {
int len = s.size(), cnt = ;
for (int i = ; i < len; i++){
cnt += helper(s, i, i); // 回文为奇数的时候
cnt += helper(s, i, i + ); // 回文为偶数的时候
}
return cnt;
}
}; Leetcode . Baseball Game You're now a baseball game point recorder. Given a list of strings, each string can be one of the following types: Integer (one round's score): Directly represents the number of points you get in this round.
"+" (one round's score): Represents that the points you get in this round are the sum of the last two valid round's points.
"D" (one round's score): Represents that the points you get in this round are the doubled data of the last valid round's points.
"C" (an operation, which isn't a round's score): Represents the last valid round's points you get were invalid and should be removed.
Each round's operation is permanent and could have an impact on the round before and the round after. You need to return the sum of the points you could get in all the rounds. Example :
Input: ["","","C","D","+"]
Output:
Explanation:
Round : You could get points. The sum is: .
Round : You could get points. The sum is: .
Operation : The round 's data was invalid. The sum is: 5.
Round : You could get points (the round 's data has been removed). The sum is: 15.
Round : You could get + = points. The sum is: . Example :
Input: ["","-2","","C","D","","+","+"]
Output:
Explanation:
Round : You could get points. The sum is: .
Round : You could get - points. The sum is: .
Round : You could get points. The sum is: .
Operation : The round 's data is invalid. The sum is: 3.
Round : You could get - points (the round 's data has been removed). The sum is: -1.
Round : You could get points. The sum is: .
Round : You could get - + = points. The sum is .
Round : You could get + = points. The sum is . Solution: class Solution {
public:
int calPoints(vector<string>& ops) {
int res = ;
int len = ops.size();
vector<int> data;
for (int i = ; i < len; i++){
if (ops[i] == "C"){
int tmp1 = data.back();
data.pop_back();
res -= tmp1;
}else if(ops[i] == "D"){
int tmp0 = * data.back();
data.push_back(tmp0);
res += tmp0;
}else if (ops[i] == "+"){
int tmp2 = data.back();
int tmp3 = data[data.size() - ];
data.push_back(tmp2 + tmp3);
res += (tmp2 + tmp3);
}else{
int tmp = stoi(ops[i]);
data.push_back(tmp);
res += tmp;
} }
return res;
}
}; leetcode . Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters. Examples: Given "abcabcbb", the answer is "abc", which the length is . Given "bbbbb", the answer is "b", with the length of . Given "pwwkew", the answer is "wke", with the length of . Note that the answer must be a substring, "pwke" is a subsequence and not a substring. 最笨的方法:o(n^):
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int res = , maxtmp;
set<char> substr;
int len = s.size();
if (len == ){
res = ;
return res;
}
for (int i = ; i < len; i++){
substr.insert(s[i]);
maxtmp = ;
for (int j = i + ; j < len; j++){
if (substr.find(s[j]) != substr.end()){
break;
}
else{
substr.insert(s[j]);
maxtmp++;
}
}
substr.clear();
res = max(res, maxtmp);
}
return res;
}
}; Leetcode . Binary Tree Paths Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: / \ \ All root-to-leaf paths are: ["1->2->5", "1->3"] /**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void helper(TreeNode* root, string path, vector<string> &result){
if (!root->left && !root -> right){ // 注意这里判断的条件是叶子节点的时候
result.push_back(path);
return;
} if (root -> left){
helper(root -> left, path + "->" + to_string(root->left->val), result);
}
if (root -> right){
helper(root -> right, path + "->" + to_string(root->right->val), result);
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
if (!root){
return result;
}
helper(root, to_string(root->val), result);
return result;
}
};
一些leetcode算法题的更多相关文章
- LeetCode算法题-Subdomain Visit Count(Java实现)
这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...
- LeetCode算法题-Number of Lines To Write String(Java实现)
这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...
- LeetCode算法题-Unique Morse Code Words(Java实现)
这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...
- LeetCode算法题-Rotate String(Java实现)
这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...
- LeetCode算法题-Rotated Digits(Java实现)
这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...
- LeetCode算法题-Letter Case Permutation(Java实现)
这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另 ...
- LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)
这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个 ...
- LeetCode算法题-Jewels and Stones(Java实现)
这是悦乐书的第313次更新,第334篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第182题(顺位题号是771).字符串J代表珠宝,S代表你拥有的石头.S中的每个字符都是 ...
- LeetCode算法题-Toeplitz Matrix(Java实现)
这是悦乐书的第312次更新,第333篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第181题(顺位题号是766).如果从左上角到右下角的每个对角线具有相同的元素,则矩阵是 ...
- LeetCode算法题-Prime Number of Set Bits in Binary Representation(Java实现)
这是悦乐书的第311次更新,第332篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第180题(顺位题号是762).给定两个正整数L和R,在[L,R]范围内,计算每个整数的 ...
随机推荐
- SQL SERVER 查看占用tempDB
use tempdb go t1.session_id, t1.internal_objects_alloc_page_count, t1.user_objects_alloc_page_count, ...
- 函数指针的返回值是指针数组,数组里放的是int;函数指针的返回值是指针数组,数组里放的是int指针
函数指针的返回值是指针数组,数组里放的是int 函数指针的返回值是指针数组,数组里放的是int指针 #include <stdio.h> #include <stdlib.h> ...
- UGUI组件之快速消息提示(飘字)
效果预览 使用情景 几乎每一个游戏都会有这种飘字提示,实现起来并不复杂, 我把它做了一个组件. 开箱即可使用,无需二次开发,如果效果不满意,开放源码,方便进行调优. 组件源码 核心代码 每次将飘字的请 ...
- Powershell批量安装SNMP服务
我要给node5-8的节点都安装snmp服务 如果不知道要安装的服务的名字,用get-windowsfeature 能显示出来所有的名字 Invoke-Command -ComputerName no ...
- 了解 IP 地址,默认网关,子网掩码,DNS 的概念和作用。
DNS(Domain Name System):域名解析服务器,在 Internet 上域名与 IP 地址一一对应,域名便于人记忆,但是机器只认识 IP 地址,他们之间的转换工作称为 ‘域名解析’,域 ...
- Golang 并发简介
并发概要 随着多核CPU的普及, 为了更快的处理任务, 出现了各种并发编程的模型, 主要有以下几种: 模型名称 优点 缺点 多进程 简单, 隔离性好, 进程间几乎无影响 开销最大 多线程 目前使用最多 ...
- CISCO静态路由配置
静态路由:手动添加路由条目到路由表中 优点:没有额外的路由cpu负担,节约带宽,增加网络安全性. 缺点:必须去了解整个拓扑结构,如果网络拓扑发生变化,需要在所有r路由上手动修改路由表. 实验拓扑如下: ...
- java操作elasticsearch实现前缀查询、wildcard、fuzzy模糊查询、ids查询
1.前缀查询(prefix) //prefix前缀查询 @Test public void test15() throws UnknownHostException { //1.指定es集群 clus ...
- 使用Java命令行方式导入第三方jar包来运行Java程序的命令
1.首先使用命令行进入到a.java所在的文件夹:(比如我的在D:\javaeeworkspace\SharedPS_WS\src\com\dyf\main 这样一个路径下,) d: 回车, cd D ...
- python 类与类之间的关系
一.依赖关系(紧密程度最低) (1)简单的定义:就是方法中传递一个对象.此时类与类之间存在依赖关系,此关系比较低. (2)实例植物大战僵尸简易版 题目要求:创建一个植物,创建一个僵尸 1.植物:名字. ...