From e5ad1f468be1d31df7200f375c53849ed4a744ae Mon Sep 17 00:00:00 2001 From: Donne Martin Date: Thu, 7 May 2015 19:59:28 -0400 Subject: [PATCH] Added notebook solving the following: Determine if a string s1 is a rotation of another string s2. --- arrays-strings/rotation.ipynb | 116 ++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 arrays-strings/rotation.ipynb diff --git a/arrays-strings/rotation.ipynb b/arrays-strings/rotation.ipynb new file mode 100644 index 0000000..19d05a6 --- /dev/null +++ b/arrays-strings/rotation.ipynb @@ -0,0 +1,116 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Problem: Determine if a string s1 is a rotation of another string s2. Also write a function is_substring which you can only call once to determine whether a rotation occurs\n", + "\n", + "* [Clarifying Questions](#Clarifying-Questions)\n", + "* [Test Cases](#Test-Cases)\n", + "* [Algorithm](#Algorithm)\n", + "* [Code](#Code)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Clarifying Questions\n", + "\n", + "* Is the string ASCII (extended)? Or Unicode?\n", + " * ASCII extended, which is 256 characters\n", + "* Can you use additional data structures? \n", + " * Yes\n", + "* Is this case sensitive?\n", + " * Yes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Test Cases\n", + "\n", + "* Any strings that differ in size results in False\n", + "* NULL, 'foo' -> False (any NULL results in False)\n", + "* ' ', 'foo' -> False\n", + "* ' ', ' ' -> True\n", + "* 'foobarbaz', 'barbazfoo' -> True" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Algorithm\n", + "\n", + "Using the following test case:\n", + "* s1 = 'barbazfoo'\n", + "* s2 = 'foobarbaz'\n", + "\n", + "We see that if we can use the given is_substring method if we take compare s2 with s1 + s1:\n", + "* s2 = 'foobarbaz'\n", + "* s3 = 'barbaz*foobarbaz*foo'\n", + "\n", + "Complexity:\n", + "* Time: O(n)\n", + "* Space: O(2n) of additional space for s3, which reduces to O(n)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Code" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def is_substring(s1, s2):\n", + " return s1 in s2\n", + "\n", + "def is_rotation(s1, s2):\n", + " if s1 is None or s2 is None:\n", + " return False\n", + " if len(s1) != len(s2):\n", + " return False\n", + " s3 = s1 + s1\n", + " return is_substring(s2, s3)\n", + "\n", + "print(is_rotation('o', 'oo'))\n", + "print(is_rotation(None, 'foo'))\n", + "print(is_rotation('', 'foo'))\n", + "print(is_rotation('', ''))\n", + "print(is_rotation('foobarbaz', 'barbazfoo'))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +}