算法题目积累0721

1,两个字符串的最长公共子串

基本思想是扫描两次矩阵,第一次进行字符比较;第二次找出对角线为1的最长长度

package com.bobo.interview;

import com.bobo.util.MetrixPrint;

/**
 *  这个类实现的功能室查找两个字符串的最长公共子串(要求连续)
 *  扫描两次矩阵,第一次的时候是两个字符串的比较,相等的位置赋值1,不等的位置赋值0
 *  第二次扫描,找出对角线为1的最大长度
 *  需要注意的是:分支不止一个的情况
 * @author weibo.lwb
 *
 */
public class LargestCommonStr {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        LargestCommonStr test=new LargestCommonStr();
        test.largestCommonStr("abce", "ebcen");

    }

    public int largestCommonStr(String str1,String str2){
        int n=str1.length();
        int m=str2.length();
        int metrix[][]=new int[n][m];
        //第一遍扫描,两个字符串相等的地方赋值1,否则赋值为0
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(str1.charAt(i)==str2.charAt(j)){
                    metrix[i][j]=1;
                }else{
                    metrix[i][j]=0;
                }
            }
        }

        System.out.println("第一次扫描之后构建的矩阵为:");
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                System.out.print(metrix[i][j]+" ");
            }
            System.out.println();
        }
        int max=0;
        int xpos=0;
        int ypos=0;
        //第二遍扫描,看上个矩阵对角线为1的最大长度

        for(int i=1;i<n;i++){
            for(int j=1;j<m;j++){
                if(metrix[i-1][j-1]>=1&&metrix[i][j]>=1){
                    metrix[i][j]=metrix[i-1][j-1]+1;
                    if(max<metrix[i][j]){
                        max=metrix[i][j];
                        xpos=i;
                        ypos=j;
                    }
                }
            }

        }
        System.out.println("第2次扫描之后构建的矩阵为:");
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                System.out.print(metrix[i][j]+" ");
            }
            System.out.println();
        }

        //两次扫描之后完成,之后需要做的是输出公共子串
        System.out.println("最长公共子串的长度为:"+max);
        System.out.println(str1.substring(xpos-max+1,xpos+1));
        return max;

    }

}

最长公共子串

2,两个字符串的最长公共子序列

基本思想,注意这里是构建一个(len1+1)*(len2+1)的矩阵

利用动态规划的递推公式:

f(i,j)=f(i-1,j-1)+1 如果str1[i]=str2[j]

f(i,j)=max{f(i-1,j),f(i,j-1)}如果str1[i]!=str2[j]

对于该矩阵赋予的初值是第一行和第一列都等于0

package com.bobo.interview;

import com.bobo.util.MetrixPrint;

/**
 * 该类主要是实现计算两个字符串的最长公共子序列(不要求连续)
 * 采用动态规划的方法
 * @author weibo.lwb
 *
 */
public class LargestCommonList {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        LargestCommonList test=new LargestCommonList();
        test.largestCommonList("agbic", "abcmn");
    }

    public static int largestCommonList(String str1,String str2){
        int len1=str1.length();
        int len2=str2.length();
        int[][] result=new int[len1+1][len2+1];
        for(int i=0;i<=len1;i++){
            result[i][0]=0;
        }
        for(int j=0;j<=len2;j++){
            result[0][j]=0;
        }

        for(int i=1;i<=len1;i++){
            for(int j=1;j<=len2;j++){
            if(str1.charAt(i-1)==str2.charAt(j-1)){
                System.out.print(str1.charAt(i-1));
                result[i][j]=result[i-1][j-1]+1;
            }else{
                result[i][j]=result[i-1][j]>result[i][j-1]?result[i-1][j]:result[i][j-1];
            }
            }

        }
        System.out.println();
        MetrixPrint.printMetrix(result);
        return result[len1][len2];
    }

}

最长公共子序列

3,计算2的n次方

动态规划,减少计算次数

package com.bobo.interview;

public class cal2mi {

    /**
     * @param args
     */
    public static void main(String[] args) {
        cal2mi test=new cal2mi();
        System.out.println(test.cal2byn(3));
        System.out.println(test.cal2byn(10));

    }

    public static int cal2byn(int n){
        if(n==0){
            return 1;
        }
        if(n==1){
            return 2;
        }
        if(n%2==0){
            return cal2byn(n/2)*cal2byn(n/2);
        }else
        {
            return 2*cal2byn((n-1)/2)*cal2byn((n-1)/2);
        }

    }

}

计算2的n次方

4,计算所有的全排列

4,计算字典序的全排列

算法题目积累0721

时间: 2024-09-30 18:44:34

算法题目积累0721的相关文章

一个关于字符串匹配的算法题目

有这样一个算法题目 假设这有一个各种字母组成的字符串,假设这还有另外一个字符串,而且这个字符串里的字母数相对少一些.从算法是讲, 什么方法能最快的查出所有短字符串里的字母在长字符串里都有? 比如,如果是下面两个字符串: String 1: ABCDEFGHLMNOPQRS String 2: DCGSRQPOM 答案是true,所有在string2里的字母string1也都有.如果是下面两个字符串: String 1: ABCDEFGHLMNOPQRS String 2: DCGSRQPOZ 答

【算法题目】2048游戏的最少时间 最大数

1.搜狐技术中心笔试遇到的题目 描述:假设滑动一次需要1秒,新出现是4的概率很小可以忽略,加到2048的需要的时间最少是多少? 分析:全部由2相加,得到4需要1次相加,得到8需要3次相加--得到2048需要1024-1次相加 (1024-1)/60约为17分钟 实际上,在进行加法前可能需要等待 新元素2的出现,那么估算的最少时间必然大于17分钟 具体枚举: 目标 需要时间 ? 1 2 3 4 5 6 2      0 4      3 8      5 16    10 32    20   

一道算法题目, 二行代码, Binary Tree

June 8, 2015 我最喜欢的一道算法题目, 二行代码. 编程序需要很强的逻辑思维, 多问几个为什么, 可不可以简化.想一想, 二行代码, 五分钟就可以搞定; 2015年网上大家热议的 Homebrew 的作者 Max Howell 面试 Google 挂掉的一题, 二叉树反转, 七行代码, 相比二行代码, 情有可原! Problem: return the count of binary tree with only one child 想一想, 你要写几行, 六七行, 或小于十行? S

C#常见算法题目

    //冒泡排序    public class bubblesorter    {        public void sort(int[] list)        {            int i, j, temp;            bool done = false;            j = 1;            while ((j < list.Length) && (!done))            {                don

算法题目: 动态规划 之 最短编辑距离

问题: 对于长度相同的2个字符串A和B,其距离定义为相应位置字符距离之和.2个非空格字符的距离是它们的ASCII码之差的绝对值:空格与空格的距离为0,空格与其他字符的距离为一个定值k.在一般情况下,字符串A和B的长度不一定相同.字符串A的扩展是在A中插入若干空格字符所产生的字符串.在字符串A和B的所有长度相同的扩展中,有一对距离最短的扩展,该距离称为字符串A和B的扩展距离.对于给定的字符串A和B,设计一个算法,计算其扩展距离. 测试数据: 输入:cmc      snmn        2   

iOS面试中常见的算法题目

一.前言 这里是在iOS求职中自己遇到的算法题,希望对大家有所帮助.不定期更新.如果大家想在线运行代码调试,可以将代码拷贝到这里.然后进行调试.下面就是常见的算法题目. 二.正文 1.就n的阶乘. 思路:这里面用递归实现 #include <stdio.h> int getNJ(int n) { if (n==1 || n==0) { return 1; } return n*getNJ(n-1); } int main() { printf("%d",getNJ(10))

几个有意思的算法题目

这两天奔波于参加了两场校招面试,其中有很多非常有意思的算法题目,有一部分甚至都没有找到最优的答案,比较开放的算法设计题目. 其实面试不只是算法题的交流,当中还穿插着各式各样的非技术问题,毫无防备,都不知道如何展示自己了. 看似数学推理的程序设计题: 一个盒子中有100个白球,100个黑球,每次从盒子中不放回的取出两个球,如果取得的两个球是颜色相同,放入一个白球,如果取得的两个球颜色不同,放入一个黑球?最后盒子中剩下一个黑球的概率为多少? 拓展:一个盒子中有m个白球,n个黑球,按照上面的方案,最后

PTA数据结构与算法题目集(中文) 7-14

PTA数据结构与算法题目集(中文)  7-14 7-14 电话聊天狂人 (25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤),为通话记录条数.随后N行,每行给出一条通话记录.简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔. 输出格式: 在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔.如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数. 输入样例: 4 130057

PTA数据结构与算法题目集(中文) 7-16

PTA数据结构与算法题目集(中文)  7-16 7-16 一元多项式求导 (20 分) 设计函数求一元多项式的导数. 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: 以与输入相同的格式输出导数多项式非零项的系数和指数.数字间以空格分隔,但结尾不能有多余空格. 输入样例: 3 4 -5 2 6 1 -2 0 输出样例: 12 3 -10 1 6 0题目分析:要注意判断输入停止的标志 利用~scanf来判断 其它问题到没发现 (