怕npy的牛牛
链接:https://ac.nowcoder.com/acm/contest/9556/B
来源:牛客网
题目描述
牛牛非常怕他的女朋友,怕到了走火入魔的程度,以至于每当他看到一个字符串同时含有n,p,y三个字母他都害怕的不行。现在有一个长度为m的只包含小写字母‘a’-‘z’的字符串x,牛牛想知道能令他不害怕的最长子串的长度是多少。(对于字符串”abc”来说,”c”,”ab”都是原串的子串,但”ac”不是原串子串)
基础题,滑动窗口即可解决
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回符合题意的最长的子串长度
* @param x string字符串
* @return int整型
*/
public int Maximumlength (String s) {
// write code here
if(s.length() == 0)
return 0;
int l = 0;
int len = 0;
int nnum = 0, ynum = 0, pnum = 0;
for (int i = 0; i < s.length(); i++) {
if(s.charAt(i) == 'n') nnum++;
if(s.charAt(i) == 'p') pnum++;
if(s.charAt(i) == 'y') ynum++;
while (nnum >= 1 && ynum>=1 && pnum >= 1){
if(s.charAt(l) == 'n') nnum--;
if(s.charAt(l) == 'p') pnum--;
if(s.charAt(l) == 'y') ynum--;
l++;
}
len = Math.max(len, i-l);
}
return len+1;
}
}
牛牛与后缀表达式
链接:https://ac.nowcoder.com/acm/contest/9556/C
来源:牛客网
题目描述
给定牛牛一个后缀表达式s,计算它的结果,例如,1+1对应的后缀表达式为1#1#+,‘#’作为操作数的结束符号。
其中,表达式中只含有‘+’、’-‘、’*‘三种运算,不包含除法。
本题保证表达式一定合法,且计算过程和计算结果的绝对值一定不会超过10^18
基本的栈的应用,没有括号好处理多了,这里要注意减法的减数和被减数
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 给定一个后缀表达式,返回它的结果
* @param str string字符串
* @return long长整型
*/
public long solve (String str) {
// write code here
Stack<Long> S=new Stack<>();
long x=0;
for(int i=0;i<str.length();++i){
if(str.charAt(i)>='0' && str.charAt(i)<='9'){
x*=10;
x+=str.charAt(i)-'0';
}
else if(str.charAt(i)=='#'){
S.push(x);
x=0;
}else{
long p1=S.pop();
long p2=S.pop();
switch (str.charAt(i)){
case '+': S.push(p1+p2);break;
case '-': S.push(p2-p1);break;//p2在前面
case '*': S.push(p1*p2);break;
}
}
}
return S.peek();
}
}
Tree III
链接:https://ac.nowcoder.com/acm/contest/9557/C
来源:牛客网
题目描述
给出一棵有n个节点的节点标号为1~n的有根树(根为第一个节点,并给出从第2个节点到第n个节点的父结点),请你求解它的“第二直径”的长度,即树上任意两点距离非严格的第二长距离为多少(也就是说,如果存在两条不同的,长度均为max的路径,则返回max)。
树:一张有n个节点,n-1条边的无向连通图。
经典题,两次dfs求直径即可,这里求第二长,要在直径两端分别出发,将得出的所有路径长度排序,第三大的就是答案
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param e int整型vector 长度为n-1的数组,表示结点2到结点n的父结点
* @return int整型
*/
vector<int>g[100010];
vector<int>ans;
int ma=0,m1=0;
void dfs(int x,int pr,int dep){
int i;
if(ma<dep)ma=dep,m1=x;
for(i=0;i<g[x].size();i++){
if(g[x][i]!=pr)dfs(g[x][i],x,dep+1);
}
}
void dfs2(int x,int pr,int dep){
int i;
ans.push_back(dep);
for(i=0;i<g[x].size();i++){
if(g[x][i]!=pr)dfs2(g[x][i],x,dep+1);
}
}
int tree3(vector<int>& e) {
// write code here
for(int i=0;i<e.size();i++){
g[e[i]].push_back(i+2);
g[i+2].push_back(e[i]);
}
dfs(1,-1,0);
int p=m1;
ma=m1=0;
dfs(p,-1,0);
int q=m1;
dfs2(p,-1,0);
dfs2(q,-1,0);
sort(ans.begin(), ans.end());
return ans[ans.size()-3];
}
};