9.26 字典树|双指针
lc2609
class Solution {
public:
int findTheLongestBalancedSubstring(string s) {
int ans = 0, pre = 0, cur = 0, n = s.length();
for (int i = 0; i < n; i++) {
cur++;
if (i == s.length() - 1 || s[i] != s[i + 1]) { // i 是连续相同段的末尾
if (s[i] == '1') {
ans = max(ans, min(pre, cur) * 2);
}
pre = cur;
cur = 0;
}
}
return ans;
}
};
lc611
sort
从最大数开始当三角形第三边 for
用左右指针找能和它组成三角形的两边组合
- while
- if
- ret+=(right-left);
- right--;//判断下一个 第二个元素
- else
- l++
统计所有有效组合的数量
ret+=(right-left)
class Solution {
public:
int triangleNumber(vector<int>& nums)
{
//利用 迭代器排序
sort(nums.begin(),nums.end());
int ret=0;
int n=nums.size();
for(int k=n-1;k>=2;k--)
{
//left和right是每次k都要变化的
int left=0,right=k-1;
while(left<right)
{
if(nums[left]+nums[right]>nums[k])
{
ret+=(right-left);
right--;//判断下一个 第二个元素
}
else
{
//例如 第二个元素到了right,发现不行
left++;
}
}
}
return ret;
}
};
字典树
#include <cstdio>
#include <cstring>
using namespace std;
// Trie 树结构体:用于高效存储和查询字符串集合
struct Trie {
// nex[p][c]:第 p 个节点对应字符 'a'-'z'(索引 0-25)的子节点编号
// cnt:已使用的节点总数,初始为 0(根节点编号为 0)
int nex[100000][26], cnt;
// exist[p]:标记第 p 个节点是否为某字符串的结尾
bool exist[100000];
// 插入字符串:将长度为 l 的字符串 s 存入 Trie 树
void insert(char *s, int l) {
int p = 0; // 从根节点开始遍历
for (int i = 0; i < l; i++) {
int c = s[i] - 'a'; // 字符转索引('a'→0,'z'→25)
if (!nex[p][c]) { // 若当前字符对应的子节点不存在
nex[p][c] = ++cnt; // 创建新节点,编号自增
}
p = nex[p][c]; // 移动到子节点,继续处理下一个字符
}
exist[p] = true; // 标记当前节点为字符串结尾
}
// 查找字符串:判断长度为 l 的字符串 s 是否在 Trie 树中
bool find(char *s, int l) {
int p = 0; // 从根节点开始遍历
for (int i = 0; i < l; i++) {
int c = s[i] - 'a';
if (!nex[p][c]) { // 若当前字符对应的子节点不存在,说明无此字符串
return false;
}
p = nex[p][c]; // 移动到子节点
}
return exist[p]; // 需确认当前节点是字符串结尾(避免匹配前缀)
}
};