输出所有回文子串

public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArrayList<String> arr = new ArrayList<String>();
		String str = "abbac";
		int len = str.length();
		for(int i=0;i<len;i++) {
			for(int j=i+1;j<=len;j++) {
				String now = str.substring(i,j);
				if(isHw(now)) {
					arr.add(now);
				}
			}
		}
		for(String s:arr) {
			System.out.println(s);
		}
	}
	public static boolean isHw(String s) {
		for(int i=0;i<s.length()/2;i++) {
			if(s.charAt(i)!=s.charAt(s.length()-1-i)) {
				return false;
			}
		}
		return true;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一种可能的RISC-V汇编程序实现,思路是从长度为1开始,逐步扩大回文子串的长度,然后检查是否存在回文子串,若存在则输出位置和长度,否则输出-1: ``` # 字符串存放在.data段的str数组中,共10个字符 .data str: .ascii "abcbadefgh" # 回文子串存放在.data段的result数组中,共2个整数,分别为位置和长度 result: .word 0, 0 # 用于存放回文子串的起始位置和长度的寄存器 s0: .word 0 s1: .word 0 .text .globl main main: # 初始化 la x10, str # 加载字符串地址到x10 li x11, 1 # 初始化子串长度为1 li x12, 10 # 字符串长度为10 # 开始循环,逐步扩大子串长度 lp1: beq x11, x12, not_found # 子串长度已经达到字符串长度,未找到回文子串 addi x11, x11, 1 # 子串长度加1 li x13, 0 # 初始化子串起始位置为0 lp2: add x14, x10, x13 # 计算子串起始地址 add x15, x14, x11 # 计算子串结束地址 blt x15, x10, not_found # 子串结束地址超出字符串结尾,未找到回文子串 beq x11, x12, not_found # 子串长度已经达到字符串长度,未找到回文子串 jal ra, is_palindrome # 检查子串是否是回文子串 beqz a0, lp2 # 如果不是,继续循环 sw x13, s0 # 如果是,保存回文子串的位置和长度 sw x11, s1 j found found: lw a0, s0 lw a1, s1 j print_result not_found: li a0, -1 j print_result # 检查子串是否是回文子串,如果是,返回1;否则返回0 # a0: 子串起始地址 # a1: 子串长度 # 返回值:0表示不是回文子串,1表示是回文子串 is_palindrome: addi sp, sp, -4 # 分配栈空间 sw ra, 0(sp) # 保存返回地址 add x10, a0, a1 # 计算子串结束地址 addi x11, a1, -1 # 计算子串中间位置 srai x11, x11, 1 lp: beq a0, x10, yes # 字符串已经遍历完,是回文子串 lbu x12, 0(a0) # 加载左边的字符 lbu x13, 0(x10) # 加载右边的字符 bne x12, x13, no # 当左右两边的字符不相同时,不是回文子串 addi a0, a0, 1 # 左边位置加1 addi x10, x10, -1 # 右边位置减1 blt a0, x10, lp # 继续循环 yes: li a0, 1 # 是回文子串 j end no: li a0, 0 # 不是回文子串 end: lw ra, 0(sp) # 恢复返回地址 addi sp, sp, 4 # 释放栈空间 ret # 输出结果 # a0: 回文子串位置或-1 # a1: 回文子串长度或0 print_result: li x10, 1 # 用于输出的系统调用编号 li x11, 1 # 输出到标准输出 mv x12, a0 # 第一个参数是回文子串的位置或-1 mv x13, a1 # 第二个参数是回文子串的长度或0 ecall # 进行系统调用 li x10, 10 # 退出程序的系统调用编号 ecall # 进行系统调用 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值