题目一
无重复字串的最长字串
解题思路:
双指针:设置两个指针L,R,分别指向traget的开头和结尾,并且使用一个哈希表存储char到int的映射,然后R++,当出现重复的字符,那么要在对应的哈希表里面--。
代码:
def main():
s=input()
m=[0]*(256)
count=0
i,j=0,0
m[ord(s[0])] = 1
while i<len(s) and j<len(s)-1:#i为左指针,j为右指针
j+=1
if(m[ord(s[j])]==0):
m[ord(s[j])]+=1
else:#当遇到相同元素回退
while s[i]!=s[j]:
m[ord(s[i])]-=1
i+=1
i+=1
result = s[i:j + 1]
count = max(j-i+1,count)
# print(result)
print(count)
if __name__ == '__main__':
main();
第二题:最小字串覆盖
思路:使用滑动窗口,当满足了包含target的条件开始删除滑动窗口的头部,知道达到最小的窗口体。
其实也就是每一次都包括两个操作:1、找到满足target的窗口2、删除滑动窗口头部。
def judge(s,t,l,r):
m = [0] * (256)
for i in t:
m[ord(i)] += 1
for i in range(l,r+1):
if s[i] in t:
m[ord(s[i])] -= 1
for i in m:
if i > 0:
return False
return True
def main():
result = "No"
s = input()
t = input()
l = r = 0 #定义一个滑动窗口
num = 100000
# print("字符串",len(s))
while(r < len(s) and l<=r):
if judge(s,t,l,r):
# tmp = s[l:r + 1]
# print("满足条件的字符串:",tmp)
l += 1
while judge(s,t,l,r):
# tmp = s[l:r + 1]
# print("滑动窗口缩小:",tmp)
l+=1
l -= 1
if (r-l+1) < num:
num = r-l+1
result = s[l:r + 1]
r += 1
print(result)
if __name__ == '__main__':
main();
第三题 方块桶
题目意思:
解题思路:
注意:不能只看空间两边的方块
思路:不断维护两边最高的高度
def main():
n = int(input())
a = [int(i) for i in input().split()]
# print(n,a)
l = 0
r = n - 1
maxl = a[0]
maxr = a[n-1]
ans = 0
while l<r:
if maxl <= maxr:
l += 1
maxl = max(maxl, a[l])
ans += maxl - a[l]
else:
r -= 1
maxr = max(maxr, a[r])
ans += maxr - a[r]
print(ans)
if __name__ == '__main__':
main();
第四题:跑步
解题思路:没看懂,但是跟着例子顺了一遍大概是这个流程。
ahhhh反正我是写不出来这个代码
#include<bits/stdc++.h>
using namespace std;
int n;
pair <int,int> a[100010];
int main( )
{
scanf("%d",&n);
for(int i = 1;i <= n; i++) {
scanf("%d%d",&a[i].first,&a[i].second),a[i].second=-a[i].second;}
sort(a+1,a+1+n);
for(int i = 1; i <=n; i++){
if(a[i].first == a[i+1].first) a[i].second = 1e9 -i;
else a[i].second = -a[i].second;
}
int cur = 0, ans = 0,lst = 1e9;
for(int i = n;i > 0;i--){
if(a[i].second <= lst) lst = a[i].second,cur =0;
ans = max(ans,++cur);
}
cout<<ans<<endl;
return 0;
}
第五题:循环同构
解题思路
看着就很难,等有空再写