史上最全最丰富的“最长公共子序列”、“最长公共子串”问题的解法与思路

2023-05-16

花了一天时间把一直以来的“最大子序列”、“最大递增子序列“、”最大公共子序列“、“最长公共子串”等问题总结了一下。其中参考了若干博文,都备注引用。

首先子序列是指一个一个序列中,由若个数(字母)组成,然后从中任意删掉几个数(字母),保留剩下的数(字母)构成了一个序列,即称子序列。(或者从一个序列中,任意选取若干数或字符,按照这些数或字符原来的排序组成新的序列,即称子序列)

子串是指在一个字符串中任意选取连续的一段字符串,即称子串。


1首先看一下 最大子序列

最大子序列是要找出由数组成的一维数组中和最大的连续子序列。比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大;而 {5,-6,4,2}的最大子序列是{4,2},它的和是6。你已经看出来了,找最大子序列的方法很简单,只要前i项的和还没有小于0那么子序列就一直向后扩展,否则丢弃之前的子序列开始新的子序列,同时我们要记下各个子序列的和,最后找到和最大的子序列。

int maxSubSum(const vector<int> & arr,int &begin,int &end){
    int maxSum=0;
    int currSum=0;
    int newbegin=0;
    for(int i=0;i<arr.size();++i){
        currSum+=arr[i];
        if(currSum>maxSum){
            maxSum=currSum;
            begin=newbegin;
            end=i;
        }
        if(currSum<0){
            currSum=0;
            newbegin=i+1;
        }
    }
    return maxSum;
}
参考博客:

最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离

上述这篇博客中关于“最长递增子序列”讲解的不太好,我自己重新查看了如下的博客,讲解“最长递增子序列”的内容比较好。


2 最长递增子序列

最长递增子序列问题的描述:设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其中k1<k2<…<km且aK1<ak2<…<akm。求最大的m值。

设f(i)表示L中以ai为末元素的最长递增子序列的长度。则有如下的递推方程:

这个递推方程的意思是,在求以ai为末元素的最长递增子序列时,找到所有序号在L前面且小于ai的元素aj,即j<i且aj<ai。如果这样的元素存在,那么对所有aj,都有一个以aj为末元素的最长递增子序列的长度f(j),把其中最大的f(j)选出来,那么f(i)就等于最大的f(j)加上1,即以ai为末元素的最长递增子序列,等于以使f(j)最大的那个aj为末元素的递增子序列最末再加上ai;如果这样的元素不存在,那么ai自身构成一个长度为1的以ai为末元素的递增子序列。

public void lis(float[] L)
  {
         int n = L.length;
         int[] f = new int[n];//用于存放f(i)值;
         f[0]=1;//以第a1为末元素的最长递增子序列长度为1;
         for(int i = 1;i<n;i++)//循环n-1次
         {
                f[i]=1;//f[i]的最小值为1;
                for(int j=0;j<i;j++)//循环i 次
                {
                       if(L[j]<L[i]&&f[j]>f[i]-1)
                              f[i]=f[j]+1;//更新f[i]的值。
                }
         }
         System.out.println(f[n-1]);            
  }

最长递增子序列问题---动态规划

动态规划算法之最长递增子序列问题


3 重点来了,难点与考点基本都集中在”最长公共子序列“和”最长公共子串“。首先看 最长公共子序列


必须推荐这篇博客,用动态规划思想解最长公共子序列问题,详细说明了解题方法和分析思路动态规划解最长公共子序列问题


问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。令给定的字符序列X=“x0,x1,…,xm-1,序列Y=“y0,y1,…,yk-1X的子序列,存在X的一个严格递增下标序列<i0,i1,…,ik-1>,使得对所有的j=0,1,…,k-1,有xij=yj。例如,X=“ABCBDAB”,Y=“BCDB”是X的一个子序列。

考虑最长公共子序列问题如何分解成子问题,设A=“a0,a1,…,am-1B=“b0,b1,…,bn-1,并Z=“z0,z1,…,zk-1为它们的最长公共子序列。不难证明有以下性质:

(1) 如果am-1=bn-1,则zk-1=am-1=bn-1,且“z0,z1,…,zk-2是“a0,a1,…,am-2和“b0,b1,…,bn-2的一个最长公共子序列;

(2) 如果am-1!=bn-1,则若zk-1!=am-1,蕴涵“z0,z1,…,zk-1是“a0,a1,…,am-2和“b0,b1,…,bn-1的一个最长公共子序列;

(3) 如果am-1!=bn-1,则若zk-1!=bn-1,蕴涵“z0,z1,…,zk-1是“a0,a1,…,am-1和“b0,b1,…,bn-2的一个最长公共子序列。

这样,在找A和B的公共子序列时,如有am-1=bn-1,则进一步解决一个子问题,找“a0,a1,…,am-2和“b0,b1,…,bm-2的一个最长公共子序列;如果am-1!=bn-1,则要解决两个子问题,找出“a0,a1,…,am-2和“b0,b1,…,bn-1的一个最长公共子序列和找出“a0,a1,…,am-1和“b0,b1,…,bn-2的一个最长公共子序列,再取两者中较长者作为A和B的最长公共子序列。

 

求解:

引进一个二维数组c[][],用c[i][j]记录X[i]与Y[j] 的LCS 的长度,b[i][j]记录c[i][j]是通过哪一个子问题的值求得的,以决定搜索的方向。
我们是自底向上进行递推计算,那么在计算c[i,j]之前,c[i-1][j-1],c[i-1][j]与c[i][j-1]均已计算出来。此时我们根据X[i] = Y[j]还是X[i] != Y[j],就可以计算出c[i][j]。

问题的递归式写成:


回溯输出最长公共子序列过程:


算法分析:
由于每次调用至少向上或向左(或向上向左同时)移动一步,故最多调用(m + n)次就会遇到i = 0或j = 0的情况,此时开始返回。返回时与递归调用时方向相反,步数相同,故算法时间复杂度为Θ(m + n)。


#include <stdio.h>
#include <string.h>
#define MAXLEN 100

void LCSLength(char *x, char *y, int m, int n, int c[][MAXLEN], int b[][MAXLEN])
{
    int i, j;
    
    for(i = 0; i <= m; i++)
        c[i][0] = 0;
    for(j = 1; j <= n; j++)
        c[0][j] = 0;
    for(i = 1; i<= m; i++)
    {
        for(j = 1; j <= n; j++)
        {
            if(x[i-1] == y[j-1])
            {
                c[i][j] = c[i-1][j-1] + 1;
                b[i][j] = 0;
            }
            else if(c[i-1][j] >= c[i][j-1])
            {
                c[i][j] = c[i-1][j];
                b[i][j] = 1;
            }
            else
            {
                c[i][j] = c[i][j-1];
                b[i][j] = -1;
            }
        }
    }
}

void PrintLCS(int b[][MAXLEN], char *x, int i, int j)
{
    if(i == 0 || j == 0)
        return;
    if(b[i][j] == 0)
    {
        PrintLCS(b, x, i-1, j-1);
        printf("%c ", x[i-1]);
    }
    else if(b[i][j] == 1)
        PrintLCS(b, x, i-1, j);
    else
        PrintLCS(b, x, i, j-1);
}

int main(int argc, char **argv)
{
    char x[MAXLEN] = {"ABCBDAB"};
    char y[MAXLEN] = {"BDCABA"};
    int b[MAXLEN][MAXLEN];
    int c[MAXLEN][MAXLEN];
    int m, n;
    
    m = strlen(x);
    n = strlen(y);
    
    LCSLength(x, y, m, n, c, b);
    PrintLCS(b, x, m, n);
    
    return 0;
}

此处也推荐如下的几个博客关于对“最长公共子序列”的解法,思路与上述一样,但是具体算法实现上稍有不同。

最长公共子序列求解:递归与动态规划方法


4 对于“最长公共子串”的求解分析思路,推荐如右的博客。程序员面试100题之七:最长公共子字符串 这是大神hackbuteer1所撰写的两种思路,非常非常好!推荐看原博客。关于上述3种问题的关键部分,我已经基本总结好,需要的同学可以再点击链接进去详细查阅。对于该大神讲解“最长公共子序列”也可以观摩,学习。程序员面试100题之六:最长公共子序列

方法一:

     Longest Common Substring和Longest Common Subsequence是有区别的

     X = <a, b, c, f, b, c>

     Y = <a, b, f, c, a, b>

     X和Y的Longest Common Sequence为<a, b, c, b>,长度为4

     X和Y的Longest Common Substring为 <a, b>长度为2

    其实Substring问题是Subsequence问题的特殊情况,也是要找两个递增的下标序列

    <i1, i2, ...ik> 和 <j1, j2, ..., jk>使

     xi1 == yj1

    xi2 == yj2

    ......

    xik == yjk

    与Subsequence问题不同的是,Substring问题不光要求下标序列是递增的,还要求每次

   递增的增量为1, 即两个下标序列为:

   <i, i+1, i+2, ..., i+k-1> 和 <j, j+1, j+2, ..., j+k-1>

    类比Subquence问题的动态规划解法,Substring也可以用动态规划解决,令

    c[i][j]表示Xi和Yi的最大Substring的长度,比如

   X = <y, e, d, f>

   Y = <y, e, k, f>

   c[1][1] = 1

   c[2][2] = 2

   c[3][3] = 0

   c[4][4] = 1

   动态转移方程为:

   如果xi == yj, 则 c[i][j] = c[i-1][j-1]+1

   如果xi ! = yj,  那么c[i][j] = 0

   最后求Longest Common Substring的长度等于

   max{  c[i][j],  1<=i<=n, 1<=j<=m}

/** 
找出两个字符串的最长公共连续子串的长度
** author :liuzhiwei  
** data   :2011-08-16
**/ 
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

int longest_common_substring(char *str1, char *str2)
{
	int i,j,k,len1,len2,max,x,y;
	len1 = strlen(str1);
	len2 = strlen(str2);
	int **c = new int*[len1+1];
	for(i = 0; i < len1+1; i++)
		c[i] = new int[len2+1];
	for(i = 0; i < len1+1; i++)
		c[i][0]=0;        //第0列都初始化为0
	for(j = 0; j < len2+1; j++)
		c[0][j]=0;        //第0行都初始化为0 
	max = -1;
	for(i = 1 ; i < len1+1 ; i++)
	{
		for(j = 1; j < len2+1; j++)
		{
			if(str1[i-1]==str2[j-1])     //只需要跟左上方的c[i-1][j-1]比较就可以了
				c[i][j]=c[i-1][j-1]+1;
			else                         //不连续的时候还要跟左边的c[i][j-1]、上边的c[i-1][j]值比较,这里不需要
				c[i][j]=0;
			if(c[i][j]>max)
			{
				max=c[i][j];
				x=i;
				y=j;
			}
		}
	}

	//输出公共子串
	char s[1000];
	k=max;
	i=x-1,j=y-1;
	s[k--]='\0';
	while(i>=0 && j>=0)
	{
		if(str1[i]==str2[j])
		{
			s[k--]=str1[i];
			i--;
			j--;
		}
		else       //只要有一个不相等,就说明相等的公共字符断了,不连续了
			break;
	}
	printf("最长公共子串为:");
	puts(s);
	for(i = 0; i < len1+1; i++)         //释放动态申请的二维数组
		delete[] c[i];
	delete[] c;
	return max;
}
int main(void)
{
	char str1[1000],str2[1000];
	printf("请输入第一个字符串:");
	gets(str1);
	printf("请输入第二个字符串:");
	gets(str2);
	int len = longest_common_substring(str1, str2);
	printf("最长公共连续子串的长度为:%d\n",len);
	system("pause");
	return 0;
}

方法二:

      将字符串s1和s2分别写在两把直尺上面(我依然用s1,s2来表示这两把直尺),然后将s1固定,s2的头部和s1的尾部对齐,然后逐渐移动直尺s2,比较重叠部分的字符串中的公共子串的长度,直到直尺s2移动到s1的头部。在这个过程中求得的最大长度就是s1、s2最大子串的长度。

     下图是求解过程的图示(下图有点错误,应该是将s2从右往左移动),蓝色部分表示重叠的字符串,红色的部分表示重叠部分相同的子串

      其中s1="shaohui",s2="ahui",最后求得的结果为3


/** 
找出两个字符串的最长公共连续子串的长度
** author :liuzhiwei  
** data   :2011-08-16
**/ 
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

int longest_common_substring(char *str1, char *str2)
{
	int i,len1,len2,len,s1_start,s2_start,idx,curmax,max;
	len1 = strlen(str1);
	len2 = strlen(str2);
	len = len1 + len2;
	max = 0;
	for(i = 0 ; i < len ; i++)
	{
		s1_start = s2_start = 0;
		if(i < len1)
			s1_start = len1 - i;    //每次开始匹配的起始位置
		else
			s2_start = i - len1;
		curmax = 0;
		for(idx = 0 ; ( s1_start + idx < len1 ) && ( s2_start + idx < len2 ); idx++ )
		{
			if(str1[s1_start+idx]==str2[s2_start+idx])
				curmax++;
			else     //只要有一个不相等,就说明相等的公共字符断了,不连续了,要保存curmax与max中的最大值,并将curmax重置为0
			{
				max = curmax > max ? curmax : max;
				curmax = 0;
			}
		}
		max = curmax > max ? curmax : max;
	}
	return max;
}
int main(void)
{
	char str1[1000],str2[1000];
	printf("请输入第一个字符串:");
	gets(str1);
	printf("请输入第二个字符串:");
	gets(str2);
	int len = longest_common_substring(str1, str2);
	printf("最长公共连续子串的长度为:%d\n",len);
	system("pause");
	return 0;
}

稍微改动一下,便可以输出公共子串了,就是要保存一下连续公共子串最后一个字符在其中一个字符串中的下标位置:

/** 
找出两个字符串的最长公共连续子串的长度
** author :liuzhiwei  
** data   :2011-08-16
**/ 
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

int longest_common_substring(char *str1, char *str2)
{
	int i,k,len1,len2,len,s1_start,s2_start,idx,curmax,max;
	len1 = strlen(str1);
	len2 = strlen(str2);
	len = len1 + len2;
	max = 0;
	for(i = 0 ; i < len ; i++)
	{
		s1_start = s2_start = 0;
		if(i < len1)
			s1_start = len1 - i;    //每次开始匹配的起始位置
		else
			s2_start = i - len1;
		curmax = 0;
		for(idx = 0 ; ( s1_start + idx < len1 ) && ( s2_start + idx < len2 ); idx++ )
		{
			if(str1[s1_start+idx]==str2[s2_start+idx])
				curmax++;
			else     //只要有一个不相等,就说明相等的公共字符断了,不连续了,要保存curmax与max中的最大值,并将curmax重置为0
			{
				//max = curmax > max ? curmax : max;
				if(curmax > max)
				{
					max = curmax;
					k = s1_start+idx-1;      //保存连续子串长度增加时连续子串最后一个字符在str1字符串中的下标位置,便于输出公共连续子串
				}
				curmax = 0;
			}
		}
		//max = curmax > max ? curmax : max;
		if(curmax > max)
		{
			max = curmax;
			k = s1_start+idx-1;
		}
	}

	//输出公共子串
	char s[1000];
	for(i=0;i<max;i++)
		s[i]=str1[k-max+1+i];     //公共字串在str1中的下标起始位置为k-max+1,结束位置为k
	s[i]='\0';
	printf("最长公共子串为:");
	puts(s);
	return max;
}
int main(void)
{
	char str1[1000],str2[1000];
	printf("请输入第一个字符串:");
	gets(str1);
	printf("请输入第二个字符串:");
	gets(str2);
	int len = longest_common_substring(str1, str2);
	printf("最长公共连续子串的长度为:%d\n",len);
	system("pause");
	return 0;
}

也有其他的一些博客,显然没有上述hack大神的思路详细又好,当然可以帮助我们来学习与理解。

最长公共子字符串

动态规划算法之:最长公共子序列 & 最长公共子串(LCS)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

史上最全最丰富的“最长公共子序列”、“最长公共子串”问题的解法与思路 的相关文章

  • 什么是RT-Thread?

    一 RT Thread的定义 RT Thread xff0c 全称是 Real Time Thread xff0c 是一款主要由中国开源社区主导开发的开源实时操作系统 xff08 许可证GPLv2 xff09 xff0c 包含了实时 嵌入式
  • mbim ndis ecm ncm之我的理解

    这几个问题困扰了我很长时间 xff0c 经过我不懈的努力 加上 我的悟性 xff0c 我自认为 理解了那么一点 ndis xff08 Network Driver Interface Specification xff09 网络驱动接口规范
  • RTK基站坐标,标定

    差分基站的经纬度是人为设定的 xff0c 一般来说 xff0c RTK差分定位是测试的相对值 xff0c 但前提是要给基站设置一个相对精确的经纬度 xff0c 之前没有意识到重要性 xff0c 这次出现的问题 xff0c 确认了这一点 公司
  • Codeblocks+vscode

    由于新买了电脑 xff0c 要重装好多东西 xff0c 简单记录一下 顺序 xff1a 先codeblocks xff0c 后vscode 第一步 xff1a Codeblocks安装 Binary releases Code Blocks
  • wifi 802.11 kvr 漫游

    802 11k 802 11k为无线局域网应该如何进行信道选择 漫游服务和传输功率控制提供了标准 他提供无线资源管理 xff0c 让频段 xff08 BAND xff09 通道 xff08 CHANNEL xff09 载波 xff08 CA
  • WIFI 常识

    DSSS Direct Sequence Spread Spectrum 直接序列扩频 FHSS xff0c 跳频技术 Frequency Hopping Spread Spectrum FHSS和DSSS比较 跳频扩频 xff08 FHS
  • vscode 增加includepath

    方法一 xff1a 按下ctrl 43 shift 43 p打开命令 xff0c 搜索下面关键字 c c 43 43 edit configration 修改下面includepath栏 xff0c 按上面的说明提示修改 34 config
  • STM32F437 CAN错误(一个不发送CAN数据的节点,是会影响CAN总线的)

    终于解决综合插件CAN导致 刷揭示错误的问题 xff0c 过程记录一下 xff0c 有的时候 xff0c 很多错误是可以避免的 xff0c 但是一旦出现 xff0c 解决 排查错误的过程会区级费很长时间 我们的产品有3 4个CAN节点 xf
  • stm32使用PWM播放音频

    我之前研究过STM32的DAC播放wav音频文件 xff0c 今天突然发现使用PWM也可以实现WAV文件的播放 xff0c 让在大开了眼界 xff0c 转载如下 xff1a stm32使用PWM播放音频 pwm stm32 dac pcm
  • uboot 增加硬件看门狗

    先说说uboot的编译过程 xff1a 1 make distclean 2 make defconfig 3 make 在执行上面之前 xff0c 还需要必要 的设置 xff0c 比如配置ARCH CROSS COMPILE 等等 xff
  • ALTRA FPGA程序移植到XILINX CPLD

    由于altra FPGA买不到了 xff0c 现在使用xilinx的CPLD 95144来替换 xff0c 本来想把之前的verilog工程直接重新在ISE上编译一下 xff0c 就可以了 xff0c 看来我是低估FPGA到CPLD的移植过
  • 图形化的调试工具 j-scope systemview

    2022 03 01 当调试传感器 AD值时 xff0c 特别想把转换值直观的展示出来 xff0c 就用到了下面几咱方法 通常的解决办法是用串口上位机 xff0c USB接口上位机或者MDK的逻辑分析仪功能 xff0c 使用这三种方式都比较
  • 移远ec20模式与切换

    移远EC20支持4种模式 0 rmnet模式 通过QMI工具发的QMI命令 xff0c 获取公网IP 这种模式可以配合usb ecm驱动或高通GobiNet驱动使用 1 ecm模式 通过标准的CDC ECM发起data call xff0c
  • STM32开发必备知识篇:串口DMA空闲中断

    随着撰写博客的深入 xff0c 笔者先初步打算把博客细分为四大板块 xff1a 1 FPGA基础知识篇 xff1b 2 FPGA 20个例程篇 xff1b 3 STM32开发必备知识篇 xff1b 4 STM32 10个项目篇 xff0c
  • 大端小端(Big- Endian和Little-Endian)

    字节序 xff08 Endian xff09 xff0c 大端 xff08 Big Endian xff09 xff0c 小端 xff08 Little Endian xff09 图文并茂 http www cppblog com tx7d
  • STM32程序设计规范浅析

    这篇博客写到 STM32基础知识篇 里 xff0c 一方面是一个很好地对过往工作的总结 xff0c 另一方面也是整个专栏撰写计划的开端 xff0c 古人云 xff1a 良好的开端是成功的一半 xff0c 在文章的最后详细地规划了整个专栏后期
  • C语言编程规范(头文件规范)

    C语言的规范使用 xff0c 有利于提高代码的清晰 简洁 可测试 安全 效率 可移植 xff0c 因此必须规范使用C语言编程 代 码 总 体 原
  • C语言变量和常量命名规则

    变量命名规则 原则 1 一个变量只有一 个功能 xff0c 不能把一个变量用作多个用途 2 结构单一 xff0c 不能设计面面俱到的数据结构 xff1b 结构的定义应该明确的描述一个对象 xff0c 去掉相关相不强的数据 xff1b 3 不
  • ROS+Gazebo----Unable to find uri[model:// ]

    基于ROS 43 Gazebo环境 xff0c 用roslaunch把sdf模型加载到gazebo仿真世界 目录结构如下 输入命令roslaunch my simulation my world launch 报错 xff1a 1 不接入网
  • 最完整介绍Visual C++ 6.0和Visual Studio 2022中的编译、生成和运行(CTRL+F7、F7、CTRL+F5)

    我是荔园微风 xff0c 作为一名在IT界整整25年的老兵 xff0c 经常被Visual C 43 43 6 0和Visual Studio 2022初学者问到程序写好后怎么使用编译调试菜单以及怎么使用CTRL 43 F7 F7 CTRL

随机推荐

  • 判断大小端的方法(java和c++)

    首先我们给出大小端的定义 小端 xff1a 较高的有效字节存放在较高的的存储器地址 xff0c 较低的有效字节存放在较低的存储器地址 大端 xff1a 较高的有效字节存放在较低的存储器地址 xff0c 较低的有效字节存放在较高的存储器地址
  • vscode配置c++代码提示补全

    vscode配置c 43 43 代码提示补全 在网上找了大半天 xff0c 说的方式都试过了 xff0c 都没有适合我的 xff0c 还是自己找stackoverflow靠谱点 34 editor rulers 34 80 一行限制80字符
  • 解决头文件相互包含问题的方法

    解决头文件相互包含问题的方法 所谓超前引用是指一个类型在定义之前就被用来定义变量和声明函数 一般情况下 xff0c C C 43 43 要求所有的类型必须在使用前被定义 xff0c 但是在一些特殊情况下 xff0c 这种要求无法满足 xff
  • C++ 中头文件相互包含问题的解决办法

    我们在写C 43 43 程序的时候 xff0c 常常要把不同的类的声明放置与不同的头文件中 xff0c 以提高代码的整洁性 xff0c 如此一来 xff0c 就难免会遇到头文件相互包含的问题 xff0c 也就是说 xff0c 假设我们有两个
  • Pixhawk_nuttx启动过程和启动文件

    lt span style 61 34 font family Arial Helvetica sans serif background color rgb 255 255 255 34 gt Pixhawk nuttx启动过程 lt s
  • 施密特触发器原理图解

    施密特触发器原理图解详细分析 重要特性 xff1a 施密特触发器具有如下特性 xff1a 输入电压有两个阀值VL VH xff0c VL施密特触发器通常用作缓冲器消除输入端的干扰 施密特波形图 施密特触发器也有两个稳定状态 xff0c 但与
  • Delphi 类库(DLL)动态调用与静态调用示例讲解

    在Delphi或者其它程序中我们经常需要调用别人写好的DLL类库 下面直接上示例代码演示如何进行动态和静态的调用方法 DLL动态调用与静态调用的例子 编译环境 Delphi XE 转载或编译请不要修改此文件
  • HTML中的Hack手段之条件注释

    通常WEB 的好处就是可以跨平台 但这个世界偏偏有个另类 就是IE 浏览器 在平常做HTML 设计时 xff0c 有时需要为IE 的表示差异而不得不使用一些Hack 手段 条件注释就是这类手段之一 条件注释是IE 浏览器的 专利 也就是说我
  • JavaScript函数中的arguments对象

    ECMAScript标准中 xff0c 每个函数都有一个特殊的内置对象arguments arguments对象是一个类Array对象 object 用以保存函数接收到的实参副本 一 内置特性 说它是一个内置对象是因为我们在创建函数时并没有
  • JavaScript函数之高阶函数

    高阶函数 xff08 higher order function xff09 如果一个函数接收的参数为或返回的值为函数 xff0c 那么我们可以将这个函数称为高阶函数 众所周知 xff0c JavaScript是一种弱类型的语言 JavaS
  • 前端优化建议:合理利用JavaScript的条件运算符

    在最近的项目中要使用到一个格式化文件大小的算法 xff0c 于是不假思索写了如下代码 function formatSize size if size lt 1024 return size 43 34 B 34 else if size
  • 了解python之面向对象

    了解python之面向对象 面向对象概念 xff1a 面向对象编程 xff08 Object Oriented Programming xff0c 简称OOP xff09 是一种程序涉及思想 OOP把对象作为程序的基本单元 xff0c 一个
  • 了解python之进程与线程

    了解python之进程与线程 本文虽然叫作 了解python进程与线程 xff0c 但还是有点难度的 可以先查阅另外一篇文字 xff0c 快速入门 Python快速入门多线程与多进程 1 进程 进程 xff08 Process xff0c
  • Python快速入门多线程与多进程

    Python快速入门多线程与多进程 多线程 多线程的含义 进程我们可以理解为是一个可以独立运行的程序单位 xff0c 比如打开一个浏览器 xff0c 这就开启了一个浏览器进程 xff1b 打开一个文本编辑器 xff0c 这就开启了一个文本编
  • C++中strcmp的头文件问题

    C 43 43 中strcmp的头文件问题 今天在写程序时遇到的一个问题 include lt stdio h gt include lt string gt using std string int main char str STEL
  • strlen()函数详解

    头文件 xff1a include lt string h gt strlen 函数用来计算字符串的长度 xff0c 其原型为 xff1a unsigned int strlen char s strlen 用来计算指定的字符串s 的长度
  • 阿里云物联网平台基本设置-物模型

    陈拓 2019 12 14 2020 01 15 1 概述 如何让设备连接上云 xff1f 参考如下路径 本文以一个温度传感器为例 xff0c 演示创建产品 定义物模型 创建设备 虚拟设备调试 xff0c 这几部分 2 阿里云开通 2 1
  • Make与CMake

    1 Make与CMake 首先先来了解一下gcc xff0c gcc是GNU Compiler Collection 就是GNU编译器套件 xff0c 也可以简单认为是编译器 xff0c 它可以编译很多种编程语言 包括C C 43 43 O
  • C++学习(23)

    1 分析下述代码运行 xff1a include lt iostream gt using namespacestd int main int a 10 61 0 1 2 3 4 5 6 7 8 9 int p 61 a cout lt l
  • 史上最全最丰富的“最长公共子序列”、“最长公共子串”问题的解法与思路

    花了一天时间把一直以来的 最大子序列 最大递增子序列 最大公共子序列 最长公共子串 等问题总结了一下 其中参考了若干博文 xff0c 都备注引用 首先子序列是指一个一个序列中 xff0c 由若个数 xff08 字母 xff09 组成 xff