9.5算法

str1 转为 str2 的最少操作数(dp二维打表)

给定两个字符串 str1 和 str2 ,请你算出将 str1 转为 str2 的最少操作数。

你可以对字符串进行3种操作:

1.插入一个字符

2.删除一个字符

3.修改一个字符。

//判断长度,长度必须要相同
// 即至少需要长度之差的次数
// ?怎么确定怎么插或删是最优的?
//
// dp[i][j]表示str1[i]到str2[j]为止的子串需要的距离
// dp贪心,让每一次,每一种的情况都是最少的修改次数,那么在已经确定之前怎么修改最少的基础上再加新字符就是
// 如果两个新增的字符不相同,可以修改A新增的一个为字符为B新增的字符
// 或者先让A新增,即从下标为[i][j-1]开始,让B插入一个和A[I]相同的字符
// 或者让B新增……;
// 这三种情况都需要1次修改方式,结果也是一样的,就是在原来的基础(指之前已经修改好确定怎么修改次数最少了)上,修改为了相同的字符串
//

字符串转化成IP地址(字符串处理)

现在有一个只包含数字的字符串,将该字符串转化成IP地址的形式,返回所有可能的情况。

例如:

给出的字符串为"25525522135",

返回["255.255.22.135", "255.255.221.35"]. (顺序没有关系)

//怎么截取出一段一段的数字
// 递归截取,每次dfs,for循环三次,表示从当前位次往后尝试截取三种不同的情况
// cur+=s[i]不断修改截取字符串
// 用stoi转为数字
// 只有截取出来的数字在范围内,还要保证第一位不是0,除非只有一位(那就判断是不是只有一位,以及第一位是不是0,合取)
// 再开启下位数字的截取
// 并在开启前,处理好字符串
//
// 怎么截完所有的情况,不重不漏
//
//递归截取,dfs,在前面截取的基础上继承下标继续截取
//
//
//
//
dfs(int step, int index) {//step表示这一位之前已有的数字
    string cur;
    if (step == 4) {//到第四位就必须要回去了
        if (index == s.length()) {//而只有位数恰好为最后一位之后,才表示全部用到了,这时才加入数组,否则不为正常情况,不加入数组
            res.push_back(nums);
        }
        return;
    }
    for (int i = index; i < index + 3&&i

检验是否为ip地址(字符串处理)

编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址

IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(".")分割。比如,172.16.254.1;
同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。

IPv6 地址由8组16进制的数字来表示,每组表示 16 比特。这些组数字通过 (":")分割。比如,  2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址。而且,我们可以加入一些以 0 开头的数字,字母可以使用大写,也可以是小写。所以, 2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 address地址 (即,忽略 0 开头,忽略大小写)。

然而,我们不能因为某个组的值为 0,而使用一个空的组,以至于出现 (::) 的情况。 比如, 2001:0db8:85a3::8A2E:0370:7334 是无效的 IPv6 地址。
同时,在 IPv6 地址中,多余的 0 也是不被允许的。比如, 02001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的。

//find会找到s中的第一个分割字符,并返回位置下标
//截取substr,截取s从头到这个的全部
//然后再截取s,自己赋值给自己,就完成了字符串的截取
//分割完后必须是4块,即s.size()=4
// 不是,split函数返回以这个为分割的所有子串
// 即s[i]才是
//用stoi(string s)将字符转为数字
// 参数必须为字符串
//
//截取方法:
//查找剩余字符串中第一个找到截取字符位置的下标,而且不是最后一个字符
//然后向数组中放入0,i)不包括i的字符
//接着截取字符后端i+1开始的所有,继续下一个
//判断是不是4,首先先查答案数组是不是4个
// 接着再查每个子串,
// 用isdigit判断是不是数字,数字位数是不是过3
// 以及首位是不是0,在有多位时
// 用stoi(s)将子串转为数字,数字不可大于255,小于0
// 判断是不是6,先查是不是满8个
// 
//

大数相加(字符串)

//先倒置,倒置是为了模拟算式,即从尾端开始加,s[0]是数字的最高位
// 然后从倒置的每一位开始,用value1,2记录相加的每一位
// 相加,同时加上进位
// 再除10为下一位的进位,取余为这位上数字
// 直到指针都到头且进位为0
//

最长回文子串长度(递归)

对于长度为n的一个字符串A(仅包含数字,大小写英文字母),请设计一个高效算法,计算其中最长回文子串的长度。

//dp[i]记录从这一位开始向左右辐射的长度
//要求向左》=0,向右不超过长度
//而且每位相同,++后count,
//最后长度就是2count+1;
//
//还需要注意,这只是回文串长度为奇数的情况
//需要考虑到为偶数的情况
//那就不能辐射思想,而是左右指针
//奇数时初始左右指针重合,偶数时相邻

你可能感兴趣的:(服务器,linux,运维)