算法_leetcode_java_回文字符串和回文相关例子总结

回文:从左遍历和冲右遍历的结果一样, 其实就是一个字符串或者一个数是对称的,对称轴是中间的数或中间的间隔

判断回文字符串:

  1. 设置两个指针,一个从左边开始遍历,另一个从右开始遍历,并设置哨兵,依次比较两个元素的值;两值相同则哨兵为true,进入下一次遍历,当左边遍历到右边,右边遍历到左边时跳出循环;(这里可以改进,左右各自遍历到字符串中间的位置即可)若两值不同,哨兵为false,结束判断。
public class 回文字符串 {

	public static void main(String[] args) {
		String s="12321";
		boolean result=huiwen(s);
		System.out.println(result);
	}
	public static boolean huiwen(String str)
	{
		boolean flag=true;
		int i=0;
		int j=str.length()-1;
		while(i<=str.length()-1&&j>=0)
		{
			if(str.charAt(i)==str.charAt(j))
			{
				flag=true;
				i++;
				j--;
			}
			else {
				flag=false;
				return flag;
			}
		}
		return flag;
	}
}
  1. 使用StringBuffer中的字符串反转方法,字符反转后如果跟原来一样,不就是回文字符串了吗?
public class 回文字符串_reserve方法 {
	public static void main(String[] args) {
		String s="1232w1";
		boolean result=huiwen1(s);
		System.out.println(result);
	}
	 public static boolean huiwen1(String str)
	 {
		    String xstr=new StringBuffer(str).reverse().toString();
		    if(str.equals(xstr))
		    {
		        return true;
		    }
		    else{
		        return false;
		    }
		    }
	 }

当然了,这两个都是脑子容易想到的简单方法,可以但效率不高。

3.反转后一半数字

1.首先考虑特殊情况
1.1、负数不可能是回文数
1.2、个位数字为0的多位数不是回文数
1.3、 0,1,2,3…个位数是回文数
2.一般情况
因为回文数是对称的,前一半等于后一半,所以把后一半反转出来跟前一半比较,如果相等则是回文数。
.怎么反转出后一半?
数字%10得个位数字,数字/10后,减少了原来的个位数字,
设before为带判断的数/10后的结果,
ge为切分出来的个位数字,
after为反转出来后一半数字;
当切到中间的时候停止切分,判断前一半和后一半
.怎么知道切到中间了?前一半小于后一半呗!
如果是奇数,前一半<后一半时,把后一半去掉最后一位数字,前后相同,为回文数;
如果是偶数,前一半=后一半,为回文数

public class 回文数 {

	public static void main(String[] args) {
		int s=666661;
		boolean result=huiwenshu(s);
		System.out.println(result);
	}
	public static boolean huiwenshu(int num)
	{
		 if(num==0)
			{
				return true;
			}
		 else if(num<0||num%10==0)
		{
			return false;
		}
		
		int before=num;
		int after=0;
		int ge=0;
		while(before>after)
		{
			ge=before%10;
			before=before/10;
			after=after*10+ge;
		}
		if(before<after) {
			after=after/10;
		}
		if(before==after)
		{
			return true;
		}
		return false;
	}
}

未完待续~

KMP算法是一种字符串匹配算法,用于在一个文本串S内查找一个模式串P的出现位置。它的时间复杂度为O(n+m),其中n为文本串的长度,m为模式串的长度。 KMP算法的核心思想是利用已知信息来避免不必要的字符比较。具体来说,它维护一个next数组,其中next[i]表示当第i个字符匹配失败时,下一次匹配应该从模式串的第next[i]个字符开始。 我们可以通过一个简单的例子来理解KMP算法的思想。假设文本串为S="ababababca",模式串为P="abababca",我们想要在S中查找P的出现位置。 首先,我们可以将P的每个前缀和后缀进行比较,得到next数组: | i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | | --- | - | - | - | - | - | - | - | - | | P | a | b | a | b | a | b | c | a | | next| 0 | 0 | 1 | 2 | 3 | 4 | 0 | 1 | 接下来,我们从S的第一个字符开始匹配P。当S的第七个字符和P的第七个字符匹配失败时,我们可以利用next[6]=4,将P向右移动4个字符,使得P的第五个字符与S的第七个字符对齐。此时,我们可以发现P的前五个字符和S的前五个字符已经匹配成功了。因此,我们可以继续从S的第六个字符开始匹配P。 当S的第十个字符和P的第八个字符匹配失败时,我们可以利用next[7]=1,将P向右移动一个字符,使得P的第一个字符和S的第十个字符对齐。此时,我们可以发现P的前一个字符和S的第十个字符已经匹配成功了。因此,我们可以继续从S的第十一个字符开始匹配P。 最终,我们可以发现P出现在S的第二个位置。 下面是KMP算法的C++代码实现:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值