B.怕npy的牛牛-JAVA版
public int Maximumlength (String x) {
int n=0,p=0,y=0;
int index=0;
int max=0;
for (int i=0;i<x.length();i++) {
if (x.charAt(i)=='n') n++;
if (x.charAt(i)=='p') p++;
if (x.charAt(i)=='y') y++;
while(n>=1 && p>=1 && y>=1) {//如果三个字符出现次数都>=1 则说明前面已经同时出现npy了
if (x.charAt(index) == 'n')n--;
if (x.charAt(index) == 'p') p--;
if (x.charAt(index) == 'y') y--;//这个操作相当于找到前面字符串中,npy三个字符每个字符最后出现的位置的最小值 则不会同时出现npy三个字符的字符串是 x(index ,i]
index++;
}
max = Math.max(max,i-index+1);
}
return max;
}B.怕npy的牛牛-python版
B题我用的是滑动窗口的思想,就是维护一个数组res,不让他同时出现npy三个字母即可,
特别注意的是,如果当前字符是npy之一,当该字符放进去时,res就同时包含了npy,则此时更新res,找到npy三个字符最后一个出现位置的最小值即 index=min(last_index_n,last_index_p,last_index_y) 将index之前的remove尾部加上该字符即可,代码如下:
def Maximumlength(self , x ):
res =[]
maxx=0
for s in x:
if s not in ['p','n','y'] :
res.append(s)
elif s=='n' and ('p' not in res or 'y' not in res):
res.append(s)
elif s=='p' and ('n' not in res or 'y' not in res):
res.append(s)
elif s=='y' and ('p' not in res or 'n' not in res):
res.append(s)
else :
le = len(res)-1
if s=='n':
index = min(le-res[::-1].index('p'),le-res[::-1].index('y'))
if s=='p':
index = min(le-res[::-1].index('n'),le-res[::-1].index('y'))
if s=='y':
index = min(le-res[::-1].index('p'),le-res[::-1].index('n'))
maxx = max(maxx,len(res))
res = res[index+1:]+[s]
return max(maxx,len(res))
京公网安备 11010502036488号